多进程未使用所有核心

4
我写了一个示例脚本,在重新安装Ubuntu 20.04后遇到了问题。似乎multiprocessing只使用了一个核心。以下是我的示例脚本:
import random
from multiprocessing import Pool, cpu_count

def f(x): return x*x

if __name__ == '__main__':
    with Pool(32) as p:
        print(p.imap(f,random.sample(range(10, 99999999), 50000000)))

以下是翻译的结果:

下面是我的处理过程的图像。有什么可能会导致这种情况?

在此输入图片描述


额外的信息是,我使用了“sudo apt-install stress”命令,并成功地利用了所有32个核心。 - negfrequency
请不要将链接指向没有被接受的答案作为潜在的重复内容,而是将它们链接到文档中,以便深入了解问题的核心 --> https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool.imap ,其中代码缺少 chunksize 参数。 - gold_cy
尝试使用更重的函数f,例如def f(x): [x*x for _ in range(10**5)] - Andrey Khoronko
1个回答

8

当你的工作可以分成多个单独的工作单位并可以在多个工人之间分配时,Worker Pool是一种有效的设计模式。

为此,您需要将输入划分成块,并通过某些方式将这些块分发给所有工作人员。 multiprocessing.Pool 使用操作系统进程作为工作人员,使用单个操作系统管道作为传输层。

这引入了显着的开销,通常称为进程间通信(IPC)成本。

在您的特定示例中,您在主进程中使用 random.sample 函数生成大型数据集。这本身需要相当多的资源。然后,您将每个样本发送到单独的进程,该进程执行非常简单的计算。

不用说,大部分时间都花在主进程上,它必须生成大量数据,将其划分为默认值为1(因为这是 pool.imap 的默认值)大小的块,将每个块发送到工作人员并收集返回的值。所有工人进程基本上都在等待主进程提供工作。

如果您尝试在f函数上模拟一些计算,您会注意到所有核心都变得繁忙。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接