Самовосстанавливающиеся нити Python - PullRequest
4 голосов
/ 05 апреля 2009

Я создал веб-паука, который обращается к серверам как в США, так и в ЕС. Серверы США и ЕС имеют одинаковую структуру данных, но содержат разные данные, и я хочу сопоставить их все. Чтобы быть вежливым с сервером, между каждым запросом есть время ожидания. Поскольку программа точно такая же, чтобы ускорить обработку, я проделал программу, чтобы она могла одновременно обращаться к серверам ЕС и США.

Это сканирование займет порядка недель, а не дней. Будут исключения, и хотя я пытался обрабатывать все внутри программы, вероятно, что-то странное может возникнуть. Чтобы быть по-настоящему защищенным, я хотел бы поймать поток, который не удалось, зарегистрировать ошибку и перезапустить ее. В худшем случае я теряю несколько страниц из тысяч, что лучше, чем потерпеть неудачу в потоке, и теряет 50% скорости. Однако из того, что я прочитал, потоки Python умирают молча. У кого-нибудь есть идеи?

class AccessServer(threading.Thread):
    def __init__(self, site):
        threading.Thread.__init__(self)
        self.site = site
        self.qm = QueueManager.QueueManager(site)

    def run(self):
        # Do stuff here


def main():
    us_thread = AccessServer(u"us")
    us_thread.start()

    eu_thread = AccessServer(u"eu")
    eu_thread.start()

Ответы [ 2 ]

8 голосов
/ 05 апреля 2009

Просто используйте блок try: ... except: ... в методе run. Если происходит что-то странное, что приводит к сбою потока, весьма вероятно, что где-то в вашем коде будет выдана ошибка (в отличие от самой подсистемы потоков); таким образом, вы можете поймать его, зарегистрировать его и перезапустить поток. Это ваш вызов, хотите ли вы на самом деле закрыть поток и запустить новый, или просто заключить блок try/except в цикл while, чтобы тот же поток продолжал работать.

Другое решение, если вы подозреваете, что может произойти что-то действительно странное, что вы не можете обнаружить с помощью механизма обработки ошибок Python, - это запустить поток монитора, который периодически проверяет, работают ли другие потоки правильно.

3 голосов
/ 05 апреля 2009

Можете ли вы, например, основной поток функционирует как поток мониторинга? Например. Требовать, чтобы рабочий поток регулярно обновлял какое-либо значение метки времени для конкретного потока, а если поток не обновил свою метку времени в течение подходящего времени, должен ли поток мониторинга уничтожить его и перезапустить?

Или см. этот ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...