2

コンテキスト: ダウンロードが必要な URL の単純なキューを監視する、無期限に実行されるスクリプトがあります。URL がキューに入ると、スクリプトはその URL のスレッドが既に作成されているかどうかをチェックし、作成されていない場合は、URL が 404 を返すまで定期的にその URL からデータをフェッチするスレッドを作成します (これは私がURLは指定された期間しか利用できないため、発生することがわかります)その時点で、呼び出しsys.exitSystemExit例外を発生させ、本質的に終了のマークを付けます。

質問:スレッドが終了した特定の時間をログに記録できるようにしたいと考えています。これは、呼び出し以外の理由でスレッドが終了した場合でも、スレッドが終了した理由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) 
4

1 に答える 1

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ブロックが実行され、termination_time属性が設定されます。


SystemExitスレッドを閉じるために a を上げるのは良い習慣だとは思わないことに注意してください。ブロックを最後まで流してみませんか?

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()
于 2013-09-03T19:59:41.590 に答える