不使用所有内核的多处理

wil*_*man 5 python ubuntu multiprocessing

我写了一个示例脚本,在重新安装 Ubuntu 20.04 后遇到了问题。看来多处理只使用一个核心。这是我的示例脚本:

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)))
Run Code Online (Sandbox Code Playgroud)

我的处理图像如下。知道什么可能导致这种情况吗?

在此处输入图片说明

nox*_*fox 8

当您的工作可以拆分为可以分配给多个工作人员的单独工作单元时,工作人员池是一种有效的设计模式。

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

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

在您的具体示例中,您在主流程中使用该random.sample函数生成了一个大型数据集。仅此一项就需要相当多的资源。然后,您将每个样本发送到一个单独的进程,该进程执行非常简单的计算。

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

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