2

上下文: 我有一个脚本,它可以无限期地运行,它监视一个需要下载的简单 url 队列。如果一个 url 进入队列,脚本会检查它是否已经为该 url 生成了一个线程,如果没有,它会生成一个线程,该线程的工作是定期从该 url 获取数据,直到 url 返回一个 404(我知道会发生,因为 url 仅在指定的时间段内可用)在这一点上,它会调用sys.exit以引发SystemExit异常,并根据我的理解基本上将自己标记为终止。

问题:我希望能够记录线程退出的具体时间,即使它由于我调用之外的其他原因退出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属性将被设置。


请注意,我不认为提出 aSystemExit来关闭您的线程是一种好习惯。你为什么不只是块流到它的尽头?

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 回答