Python多进程中的动态工作池管理

3 投票
1 回答
3064 浏览
提问于 2025-04-17 12:06

我想做的是监控系统资源的使用情况,并根据需要动态增加或减少工作池中的工作者数量。

我有一台24核的服务器,配备48GB的内存。我需要处理一个4GB的数据文件,进行过滤。由于这个系统也被其他人使用,所以可用的内存会随时间变化。因为这个4GB的数据会被复制到所有的工作者那里(我还没找到避免这种情况的方法,因为我只需要在工作者中以只读的方式使用它,欢迎推荐方法,它是一个字典(dict())里面又包含字典和列表),所以我不能同时启动24个工作者,因为那样会立刻耗尽内存。因此,我想先启动6个工作者,这个数量比较安全,然后观察内存使用情况。如果内存使用量低,我就可以增加工作者的数量;如果内存使用量高,我就减少工作者的数量(也就是说,让一些工作者完成任务,但不再给他们分配新任务)。这样,我就能最大限度地利用服务器,同时保持内存使用在95%以下。

这样做的原因是,因为整个代码的运行时间通常需要几个小时,即使是6到12个并行工作者。如果我能在某段时间内将工作者的数量增加20%到30%,就能减少总的执行时间。

目前我使用了Pool.map()和Pool.apply_async()这两种方法来向工作池发送任务,所以我对这两种方法没有特别的偏好,觉得哪个更好都可以。

提前感谢大家的建议。

1 个回答

3

多进程模块提供了一种让多个进程可以共享一个字典的方法:

manager = mp.Manager()
d = manager.dict()

通过使用一个共享的字典,你可以启动24个工作进程,同时占用的内存却会少很多。当一个工作进程在访问或修改这个字典时,如果其他工作进程也想访问或修改它,就会被阻塞,暂时无法进行。不过,如果这个问题不是你程序的主要瓶颈,那么能够使用24个工作进程就能大幅度缩短你的执行时间。

撰写回答