python多处理中的动态工作池管理

时间:2012-02-01 10:44:51

标签: python multiprocessing pool

我想做的是监控系统资源的使用情况,并动态增加/减少池中的工作量。

我有一个带有48GB RAM的24核心节点,而我所做的是在需要过滤的4GB数据文件中读取。其他人也使用该系统,因此可用内存随时间变化。由于4GB输入数据被复制到所有工作者(我还没有找到一种方法如何避免这种情况,因为我只需要在工作人员只读它,建议欢迎,它是dicts()和列表的dict() )这意味着我不会产生24个工人,因为我会立即耗尽内存。所以我想做的是开始这个​​过程,说一个安全数量的6个工人,然后观察内存使用情况,并将更多的工作人员产生到池中,如果内存使用量增加,减少工人数量(即允许一些人完成) ,但不再向这些工人产生新任务)。这样我可以最大限度地利用节点,同时保持RAM使用率<95%。

这样做有效的原因是因为整个代码运行了几个小时,即使是6-12个并行工作人员,所以如果我甚至可以在一段时间内增加20-30%的工人数量,那么它将减少执行总量时间。

现在我已经使用了Pool.map()和Pool.apply_async()方法将任务发送到池中,所以如果一个方法比另一个方法效果更好,我没有直接的偏好。

提前感谢您的推荐。

1 个答案:

答案 0 :(得分:3)

多处理模块为share a dict的多个流程提供了一种方式:

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

也许通过使用共享字典,您可以产生24个工作者并且仍然使用更少的内存。当一个工作人员访问或改变字典时,如果他们也试图访问或改变字典,其他工作人员将阻止,但如果这不是主要瓶颈,那么能够使用24名工作人员可以大大减少执行时间。