如何确保挂起的线程最终在Python中收集垃圾

时间:2012-02-02 20:03:56

标签: python multithreading

我有一个长期运行的程序,它定期连接到外部网络资源。我已将这些调用包装在超时线程中,因此如果调用超过10秒,则调用会立即返回错误,如下所示:

def fetch_resource(url):
    class TimeoutThread(Thread):
        def __init__(self):
            Thread.__init__(self)
            self.result = None

        def run(self):
            self.result = requests.get(url)

    tt = TimeoutThread()
    tt.start()
    tt.join(10.0)
    if tt.result:
        return tt.result.content
    else:
        return None

但是,阅读线程文档时,Thread.join()将返回:

  1. 线程终止时,或
  2. 10秒钟
  3. 如果.join()在10秒内返回,则线程仍然存活,对吗?我知道没有好方法可以杀死线程,但是如何确保线程最终终止并获取垃圾?我担心线程可能会挂起并且永远不会返回,从而逐渐消耗掉永远不会被释放的资源。

1 个答案:

答案 0 :(得分:2)

我不知道你为什么要打扰一个单独的线程,因为你的主线程在等待请求完成或超时时被阻止了。为什么不简单地让请求超时?

请注意,您可以调用Socket.setdefaulttimeout对从该点创建的Socket对象强加默认超时,例如在库中,它们本身不会为您提供指定请求超时的选项。