Python多处理-从池中动态重新分配作业-无异步?

Python多处理-从池中动态重新分配作业-无异步?,python,synchronization,multiprocessing,pool,Python,Synchronization,Multiprocessing,Pool,因此,我使用parmap/python多处理模块将一批1000个任务分配给8个核(双xeon机器16个物理核)。目前,它使用synchronized运行 问题是,通常其中一个核心远远落后于其他核心,并且在所有其他核心完成其工作后仍有多个作业/任务要完成。这可能与核心速度(较旧的计算机)有关,但更可能是由于某些任务比其他任务更困难-因此获得稍微更困难的任务的1个核心变得滞后 我在这里有点困惑——但异步并行化就是这样做的吗?我以前尝试过使用它,但是因为这个步骤是一个非常大的处理步骤的一部分,所以不清

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

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

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

欢迎提供类似问题/答案的任何建议/链接


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

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

这里是parmap作者

默认情况下,在多处理和parmap中,任务被划分为块,块被发送到每个多处理进程(请参阅)。这背后的原因是,在许多情况下,将任务单独发送到进程会带来巨大的计算开销。如果同时以块的形式发送多个任务,则会减少开销

在多处理中,每个区块上的任务数量由
chunksize
控制(在parmap中,由
pm\u chunksize
控制)。默认情况下,
chunksize
计算为
“任务数”/(4*“池大小”)
,四舍五入(请参阅)。对于您的情况,1000/(4*4)=62.5->63个任务/块

如果像您的情况一样,许多计算昂贵的任务都属于同一块,那么该块将需要很长时间才能完成

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


从长远来看,其他答案中建议的适当排队系统是一个更好的解决方案,但对于一次性问题来说,这可能是一个过火的问题。

感谢您的建议,这是调查的正确方向。对于我的应用程序来说,这些工具似乎是多余的,它不涉及web部署或云。也许其中一个较小的任务队列工具使用起来更简单?!您可以构建简单的。这些类型的项目的好处是,如果您将代码编写成一种工具,一旦完成,您将开始在大量不同的项目中找到用法。你会发现,在一个项目中看似过度的做法在另一个项目中却起到了救命的作用;从技术上讲,多处理模块应该可以实现我所期望的功能。异步允许应用程序在进程中等待IO移动,CPU限制的计算仍然是同步的,但当您主要等待IO的数据时,asynch成为了一个巨大的速度升级,因为它可以同时打开100个连接,并允许您在数据进入时处理它们。