Python 长时间运行进程上的ThreadPoolExecutor

Python 长时间运行进程上的ThreadPoolExecutor,python,concurrency,Python,Concurrency,我想在webapp(django)上使用ThreadPoolExecutor 我看到的所有示例都使用线程池,如下所示: 使用ThreadPoolExecutor(最大工作线程数=1)作为执行器: 代码 我试图将线程池存储为类的类成员,并使用mapfunction 但是我有内存泄漏,我唯一可以使用它的方法是使用带有符号的 所以我有两个问题: 每次我使用ThreadPoolExecutor运行时,它是否会再次创建线程,然后释放它们,换句话说,这个操作是否很昂贵 如果避免将与一起使用,如何释放线程

我想在webapp(django)上使用ThreadPoolExecutor

我看到的所有示例都使用线程池,如下所示:


使用ThreadPoolExecutor(最大工作线程数=1)作为执行器:
代码
我试图将线程池存储为类的类成员,并使用
map
function

但是我有内存泄漏,我唯一可以使用它的方法是使用带有符号的

所以我有两个问题:

  • 每次我使用ThreadPoolExecutor运行
    时,它是否会再次创建线程,然后释放它们,换句话说,这个操作是否很昂贵

  • 如果避免将
    一起使用,如何释放线程的内存


  • 谢谢

    您正在使用
    concurrent.futures
    库,对吗?
    with
    语句结束后,会自动清理执行器并销毁其线程。如果要使执行器作为类成员保持活动状态,则不需要带有
    。相反,您希望让它一直保持活动状态,只要您希望它保持活动状态,并在最后处理完它时调用
    close
    (和
    del
    属性)。此外,如果您仍在使用对象,则其内存仍然活动的事实不是内存泄漏。如果您创建了一个包含一百万个项目的列表,并将其保留到以后使用,那么在使用完该列表并将其释放之前,您将无法获得这一百万个项目的内存。这与旁注相同,为什么要将
    max\u workers
    设置为1?这意味着您创建一个线程,将所有工作交给该线程,然后阻塞直到完成。这与只调用主线程中的工作具有相同的效果,但会带来额外的复杂性和开销。通常,您使用池是因为您希望同时执行一系列任务—例如,有12名工作人员从服务器获取数据,您完成任务的速度可能是在主线程中完成任务的6-12倍,但是如果使用1个worker,速度会慢一些,而不是快很多