2009-04-04 5 views
4

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

Это сканирование займет порядка недель, а не дней. Будут исключения, и пока я пытаюсь обрабатывать все внутри программы, скорее всего, что-то странное может возникнуть. Чтобы быть по-настоящему защитным, я хотел бы поймать нить, которая не удалась, зарегистрировать ошибку и перезапустить ее. В худшем случае я теряю несколько страниц из тысяч, что лучше, чем отказ потока и потерять 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() 

ответ

8

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

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

+0

Не думал прикладывать 'try: except:' в методе 'run', который выглядит как хороший, Pythonic способ сделать это. Благодаря! – cflewis

3

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

Или см this answer

+0

Это хорошая идея, и эта нить, на которую вы указали меня, отличная. Спасибо за вашу помощь! – cflewis