首页 > 解决方案 > 使用 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()

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

我的问题是

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

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

标签: pythonmultiprocessingpython-multiprocessing

解决方案


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

“正确”在这种情况下是一种价值判断。人们可以认为这是一种笨拙或巧妙的技巧。

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

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

有没有办法一次运行多个进程(进程> 1),并且在每个 n 之后仍然释放内存?

是的。maxtasksperchild创建Pool. _


推荐阅读