2013-09-03 2 views
2

Контекст: У меня есть сценарий, который работает неопределенно, который контролирует простую очередь URL-адресов, которые необходимо загрузить. Если URL-адрес поступает в очередь, скрипт проверяет, был ли он уже порожден нить для этого URL-адреса, а если нет, он порождает поток, задачей которого является получение данных с этого URL-адреса периодически, пока URL-адрес не вернет ему 404 (который я знать произойдет, потому что URL-адреса доступны только в течение определенного периода времени), в этот момент он назовет sys.exit, чтобы поднять исключение SystemExit и по существу отметить себя для завершения, насколько я его понимаю.Pythonic способ узнать, когда/почему мои потоки вышли

Вопрос: Я хотел бы иметь возможность войти в определенное время, когда выходит нить, даже если она выходит за какой-то другой причине, кроме моего звонка в sys.exit и собрать как можно больше мета-данные о том, почему он вышел, как это возможно. Каков наилучший способ сделать это? Разве потоки передают информацию родителям, которые породили их при выходе?

Код:

Упрощенный пример кода

class MyThread(threading.Thread): 
     def __init__(self, sF, id): 
      threading.Thread.__init__(self) 
      self.sourceFile = [sF] 
      self.id = id 

     def run(self): 
      #do stuff until i encounter a 404, at which point, I'll call sys.exit 

if __name__ == '__main__': 
    while True: 
     #logic to check the queue, if there is a new url, spawn a new Thread 
     #for each new thread in the queue: 
      t = MyThread(file, i) 
      t.start() 
      threads.append(t) 

ответ

5

ли это:

import datetime 

class MyThread(threading.Thread) 
    termination_cause = None 
    termination_time = None 

    #snip 

    def run(self): 
     try: 
      # do stuff 
     except Exception as e: # I wouldn't recommend this, but you asked for it 
      self.termination_cause = e # If an Exception occurred, it will be here 
     finally: 
      self.termination_time = datetime.datetime.now() 

Как только вы выходите из try блока, либо потому, что Exception был поднят или потому, что блок закончился, тогда будет выполнен блок finally, и e termination_time будет установлен атрибут.


Обратите внимание, что я не считал бы это хорошая практика, чтобы поднять SystemExit закрыть поток. Почему бы вам просто не потопить блок до конца?

def run(self): 
    try: 
     while 1: 
      if url_returns_404(url): 
       break 
      # do my thing with the URL 
    finally: 
     self.termination_time = datetime.datetime.now() 
+0

Прохладный. это покрывает когда. Будет ли покрываться sys.exc_info() или есть что-то еще, что я должен знать о том, чтобы спустить этот маршрут? – Brad

+0

Ha. вы добавили его :) Отлично. Спасибо – Brad

+0

Ваше правление говорит, что вы бы не рекомендовали часть Исключения. Я не совсем понимаю, почему? Если произойдет что-то неожиданное, я хочу знать, что это было? – Brad

Смежные вопросы