Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保挂起的线程最终在Python中得到垃圾收集_Python_Multithreading - Fatal编程技术网

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

如何确保挂起的线程最终在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):

我有一个长时间运行的程序,定期连接外部网络资源。我已经将这些调用包装在一个超时线程中,因此,如果调用耗时超过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秒后返回,则线程仍处于活动状态,对吗?我知道没有好的方法可以杀死线程,但是如何确保线程最终终止并被垃圾回收?我担心线程可能会挂起并且永远不会返回,从而逐渐耗尽从未释放的资源

    我不知道你为什么要用一个单独的线程,因为你的主线程在等待请求完成或超时时被阻塞了。为什么不让请求超时呢


    请注意,您可以调用以对从该点创建的套接字对象施加默认超时,例如,在库中,这些库本身没有为您提供指定请求超时的选项。

    如果您有一个长时间运行的线程,您可能在某个循环中运行该线程,对吗?在循环中添加一个检查,例如,如果self.\u quit设置为True,则退出循环。您可以覆盖线程的join方法以设置self.\uu quit为True,结束循环和线程执行。潜在的长时间运行线程是
    self.result=requests.get(url)
    。所以不,它不在一个循环中。那么我想它将取决于requests.get(url)中的逻辑最终返回。它在做什么?在网络呼叫超时之前给一个URL打一个网络呼叫?否则,请查看以下内容: