Python 长时间运行进程上的ThreadPoolExecutor
我想在webapp(django)上使用ThreadPoolExecutor 我看到的所有示例都使用线程池,如下所示:Python 长时间运行进程上的ThreadPoolExecutor,python,concurrency,Python,Concurrency,我想在webapp(django)上使用ThreadPoolExecutor 我看到的所有示例都使用线程池,如下所示: 使用ThreadPoolExecutor(最大工作线程数=1)作为执行器: 代码 我试图将线程池存储为类的类成员,并使用mapfunction 但是我有内存泄漏,我唯一可以使用它的方法是使用带有符号的 所以我有两个问题: 每次我使用ThreadPoolExecutor运行时,它是否会再次创建线程,然后释放它们,换句话说,这个操作是否很昂贵 如果避免将与一起使用,如何释放线程
使用ThreadPoolExecutor(最大工作线程数=1)作为执行器:
代码
我试图将线程池存储为类的类成员,并使用map
function
但是我有内存泄漏,我唯一可以使用它的方法是使用带有符号的
所以我有两个问题:
每次我使用ThreadPoolExecutor运行时,它是否会再次创建线程,然后释放它们,换句话说,这个操作是否很昂贵
如果避免将与一起使用,如何释放线程的内存
谢谢您正在使用concurrent.futures
库,对吗?with
语句结束后,会自动清理执行器并销毁其线程。如果要使执行器作为类成员保持活动状态,则不需要带有
的。相反,您希望让它一直保持活动状态,只要您希望它保持活动状态,并在最后处理完它时调用close
(和del
属性)。此外,如果您仍在使用对象,则其内存仍然活动的事实不是内存泄漏。如果您创建了一个包含一百万个项目的列表,并将其保留到以后使用,那么在使用完该列表并将其释放之前,您将无法获得这一百万个项目的内存。这与旁注相同,为什么要将max\u workers
设置为1?这意味着您创建一个线程,将所有工作交给该线程,然后阻塞直到完成。这与只调用主线程中的工作具有相同的效果,但会带来额外的复杂性和开销。通常,您使用池是因为您希望同时执行一系列任务—例如,有12名工作人员从服务器获取数据,您完成任务的速度可能是在主线程中完成任务的6-12倍,但是如果使用1个worker,速度会慢一些,而不是快很多