使用multiprocessing.pool()在列表中循环



我正在N文件列表中调用一个内存开销很大的函数。内存开销大的原因是由于许多因素造成的,如果不修改函数,这些因素是无法解决的,但我已经使用multiprocessing模块克服了内存泄漏的问题。通过为每个N文件创建一个子进程,然后调用pool.close(),可以以最小的开销释放函数中的内存。我在以下示例中实现了这一点:

def my_function(n):
do_something(file=n)
return 

if __name__ == '__main__':
# Initialize pool
for n in range(0,N,1):
pool = mp.Pool(processes=1)
results = pool.map(my_function,[n])
pool.close()
pool.join()

这正是我想要的:通过在pool中设置processes=1N文件一次运行一个文件。在每个n文件之后,我调用pool.close(),它关闭进程并将内存释放回操作系统。以前,我根本不使用multiprocessing,只是一个for循环,内存会累积到我的系统崩溃。

我的问题是

  1. 这是实现此功能的正确方法吗
  2. 有没有更好的方法来实现这一点
  3. 是否有一种方法可以一次运行多个进程(processes>1(,并且在每次n之后仍释放内存

我只是在学习multiprocessing模块。我在这里找到了很多multiprocessing的例子,但没有一个是针对这个问题的。如果能得到任何帮助,我将不胜感激。

这是实现这一点的正确方法吗?

在这种情况下,"正确"是一种价值判断。人们可以认为这是一个博德或聪明的黑客。

有更好的方法来实现这一点吗?

是。修复my_function,使其不会泄漏内存。如果Python函数泄漏了大量内存,那么很可能您做错了什么。

是否有一种方法可以一次运行多个进程(进程>1(,并且在每个n之后仍然释放内存?

是。创建Pool时,请使用maxtasksperchild参数。

最新更新