我正在使用multiprocessor.Pool
来并行处理一些文件。该代码等待接收到文件,然后使用Pool.apply_async
将该文件发送给工作者,后者随后处理该文件。
这个代码应该一直在运行,因此我永远不会关闭池。然而,随着时间的推移,这会导致池消耗大量内存。
代码是这样的:
if __name__ == "__main__":
with Pool(processes=PROCESS_COUNT) as pool:
while True:
f = wait_for_file()
pool.apply_async(process_file, (f,))
如何在不关闭池的情况下防止内存使用率过高?
是的,如果您分配了资源,但不释放它们,无论是派生进程的数量还是简单的(一块(内存,那么在您或您的系统自愿或强制释放它们之前,您在机器上用于其他任务的资源将更少。
您可能希望使用Pool
的maxtasksperchild
参数来尝试杀死从机,例如,如果它们分配了内存,而您在某个地方发生了泄漏,则至少可以节省一些资源。
注意:池中的工作进程通常在池的工作队列的整个持续时间内运行。在其他系统(如Apache、mod_wsgi等(中,释放工作人员持有的资源的一种常见模式是允许池中的工作人员在退出、清理和生成新进程以替换旧进程之前只完成一定数量的工作。Pool的maxtasksperchild参数向最终用户公开了这一功能。
或者,不要推出自己的Pool
实现,因为在实现之前,它会有问题,并且会不必要地浪费时间相反使用例如Celery(教程(,希望它甚至可以测试你可能花费更多时间在不必要的情况下的恶劣角落案例。
或者,如果你想尝试一下,这里有一个类似的问题,它提供了自定义从属池管理的步骤。