Python多进程从池中动态重新分配作业而不使用异步?

2024-05-13 11:20:08 发布

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

因此,我使用parmap/python多处理模块将一批1000个任务分配给8个核(双xeon机器16个物理核)。当前使用synchronized运行。你知道吗

问题是,通常其中一个核心远远落后于其他核心,并且在所有其他核心完成其工作后仍有几个作业/任务要完成。这可能与核心速度(较旧的计算机)有关,但更可能是由于某些任务比其他任务更困难-因此获得稍微更困难的工作的1核心变得滞后。。。你知道吗

我在这里有点困惑-但异步并行化就是这样做的吗?我以前尝试过使用它,但是因为这个步骤是一个非常大的处理步骤的一部分,所以不清楚如何创建一个屏障来强制程序等待所有异步进程完成。你知道吗

任何类似问题/答案的建议/链接都将不胜感激。你知道吗

[编辑]澄清一下,这些进程可以独立运行,它们都将数据保存到磁盘,不共享变量。你知道吗


Tags: 模块答案程序机器核心进程计算机作业
2条回答

parmap作者在这里

默认情况下,在multiprocessing和parmap中,任务被划分成块,块被发送到每个multiprocessing进程(参见multiprocessing documentation)。这背后的原因是,在许多情况下,将任务单独发送到进程会带来巨大的计算开销。如果同时发送多个任务(成批),则开销会减少。你知道吗

在多处理中,每个块上的任务数由chunksize控制(在parmap中由pm_chunksize控制)。默认情况下,chunksize计算为"number of tasks"/(4*"pool size"),四舍五入(见multiprocessing source code)。因此,对于您的情况,1000/(4*4)=62.5->;63个任务/块。你知道吗

如果像您的情况一样,许多计算开销大的任务都属于同一块,那么该块将需要很长时间才能完成。你知道吗

解决这个问题的一种“廉价且简单”的方法是传递一个较小的chunksize值。请注意,使用extreme chunksize=1可能会引入不希望的更大cpu开销。你知道吗

从长远来看,像其他答案中所建议的那样,一个合适的排队系统是一个更好的解决方案,但是对于一个一次性问题来说,它可能是一个过度的解决方案。你知道吗

您确实需要考虑创建微服务和使用队列池。例如,您可以将作业列表放在芹菜或redis中,然后让微服务从队列中一次提取一个作业并处理该作业。一旦完成,他们拉下一个项目,以此类推。这样的话,你的负载是根据准备情况来分配的,而不是根据预设的列表。你知道吗

http://www.celeryproject.org/

https://www.fullstackpython.com/task-queues.html

相关问题 更多 >