如何确保挂起的线程最终在Python中得到垃圾收集
我有一个长时间运行的程序,定期连接外部网络资源。我已经将这些调用包装在一个超时线程中,因此,如果调用耗时超过10秒,则调用会立即返回错误,如下所示:如何确保挂起的线程最终在Python中得到垃圾收集,python,multithreading,Python,Multithreading,我有一个长时间运行的程序,定期连接外部网络资源。我已经将这些调用包装在一个超时线程中,因此,如果调用耗时超过10秒,则调用会立即返回错误,如下所示: def fetch_resource(url): class TimeoutThread(Thread): def __init__(self): Thread.__init__(self) self.result = None def run(self):
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秒后返回,则线程仍处于活动状态,对吗?我知道没有好的方法可以杀死线程,但是如何确保线程最终终止并被垃圾回收?我担心线程可能会挂起并且永远不会返回,从而逐渐耗尽从未释放的资源 我不知道你为什么要用一个单独的线程,因为你的主线程在等待请求完成或超时时被阻塞了。为什么不让请求超时呢
请注意,您可以调用以对从该点创建的套接字对象施加默认超时,例如,在库中,这些库本身没有为您提供指定请求超时的选项。如果您有一个长时间运行的线程,您可能在某个循环中运行该线程,对吗?在循环中添加一个检查,例如,如果self.\u quit设置为True,则退出循环。您可以覆盖线程的join方法以设置self.\uu quit为True,结束循环和线程执行。潜在的长时间运行线程是
self.result=requests.get(url)
。所以不,它不在一个循环中。那么我想它将取决于requests.get(url)中的逻辑最终返回。它在做什么?在网络呼叫超时之前给一个URL打一个网络呼叫?否则,请查看以下内容: