如何确保Python中挂起的线程最终被垃圾回收
我有一个长时间运行的程序,它会定期连接外部网络资源。我把这些连接的调用放在一个超时线程里,这样如果调用超过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()
方法会在以下两种情况下返回:
- 当线程结束时,或者
- 在10秒后
如果.join()
在10秒后返回,那说明线程还在运行,对吧?我知道没有好的方法可以强制结束线程,但我该如何确保线程最终会结束并被垃圾回收呢?我担心线程可能会挂起,永远不返回,从而逐渐消耗资源而得不到释放。
1 个回答
2
我不明白你为什么要使用一个单独的线程,因为你的主线程在等待请求完成或超时时,反正也是被阻塞的。为什么不直接设置请求超时呢?
请注意,你可以调用 Socket.setdefaulttimeout 来为从那时起创建的 Socket 对象设置一个默认的超时时间,比如在一些库中,它们自己并没有提供设置请求超时的选项。