python中的多处理不会释放内存

Posted

技术标签:

【中文标题】python中的多处理不会释放内存【英文标题】:Multiprocessing in python won't releae memory 【发布时间】:2021-01-11 01:04:33 【问题描述】:

我正在运行多处理代码。代码框架如下:

def func_a(x):
    #main function here
    return result

def func_b(y):
    cores = multiprocessing.cpu_count() - 1
    pool = multiprocessing.Pool(processes=cores)
    results = pool.map(func_a, np.arange(1000)
    return results

if __name__ == '__main__':
     final_resu = []
     for i in range(0, 200):
         final_resu.append(func_b(i))

我在这段代码中发现的问题有两个问题:首先,内存在循环过程中不断上升。其次,在任务管理器(windows10)中,python 执行的数量逐步增加,即从 14 到 25,到 36,到 47 ......每次迭代都在主循环中完成。

我认为多处理有问题,但我不知道如何处理它。好像func_b中的multiprocessing在主循环完成一个循环后没有被删除?

【问题讨论】:

【参考方案1】:

正如文档中的示例所示,当您使用完 Pool 后,您应该通过 pool.close() 后跟 pool.join() 明确关闭它。也就是说,如果另外,您只创建了一次Pool - 例如,将Pool 作为参数传递给func_b()。并在__name__ == '__main__' 块中创建并关闭它一次。

【讨论】:

我也刚找到它。我只在最后一行的 func_b 中添加了一个 pool.close() 。到目前为止,运行的代码看起来还不错。我必须在 pool.close() 之后添加一个 pool.join() 吗?为什么我们需要 pool.join()? close() 告诉池它可以关闭所有机器以传递新的工作项。 join() 等待所有当前工作项目完成,然后再拆除其余机器。 join() 还具有另一个重要目的:一般来说,没有好的方法可以报告工作进程中发生的异常,因为它们所做的与主程序无关。 join() 提供了一个同步点,而执行 join() 有时是唯一您可以查看工作进程中引发的异常的方式。 非常感谢您的解释!我刚刚在 pool.close() 之前添加了 pool.join()。但是,错误跳出说“池仍在运行”。这是否意味着它不能关闭?我应该做些什么来正确关闭它吗? 错误顺序:close 先,然后 join

以上是关于python中的多处理不会释放内存的主要内容,如果未能解决你的问题,请参考以下文章

解析XML后,Python不会释放内存

scikit Grid Search 和 Python 通常不会释放内存

使用颜色条删除图像不会释放 matplotlib 中的内存?

Perl 子程序中的变量不会释放内存

如何释放Python占用的内存

当试图释放堆管理器分配的内存时会发生啥,它分配的比要求的多?