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

2024-06-01 02:11:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这样做是有效的,因为即使有6-12个并行工作线程,整个代码也要运行几个小时,所以如果我能在一段时间内将工人数量增加20-30%,那么总的执行时间就会减少。在

现在我都用过了池.map()和Pool.apply_异步()方法将任务发送到池中,因此如果一种方法比另一种方法更好,我没有直接的首选项。在

提前感谢您的推荐。在


Tags: 方法内存数量节点数据文件时间情况动态
1条回答
网友
1楼 · 发布于 2024-06-01 02:11:16

多处理模块为多个进程提供了一种方法share a dict

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

也许通过使用共享dict,您可以生成24个worker,但仍然使用更少的内存。当一个worker访问或变更dict时,如果其他worker也试图访问或修改dict,那么其他worker将阻塞,但是如果这不是主要的瓶颈,那么能够使用24个worker可以显著减少您的执行时间。在

相关问题 更多 >