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中的多处理不会释放内存的主要内容,如果未能解决你的问题,请参考以下文章
scikit Grid Search 和 Python 通常不会释放内存