我有一个长期运行的程序,它定期连接到外部网络资源。我已将这些调用包装在超时线程中,因此如果调用超过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()
将返回:
如果.join()
在10秒内返回,则线程仍然存活,对吗?我知道没有好方法可以杀死线程,但是如何确保线程最终终止并获取垃圾?我担心线程可能会挂起并且永远不会返回,从而逐渐消耗掉永远不会被释放的资源。
答案 0 :(得分:2)
我不知道你为什么要打扰一个单独的线程,因为你的主线程在等待请求完成或超时时被阻止了。为什么不简单地让请求超时?
请注意,您可以调用Socket.setdefaulttimeout对从该点创建的Socket对象强加默认超时,例如在库中,它们本身不会为您提供指定请求超时的选项。