繁体   English   中英

多处理不使用所有内核

[英]multiprocessing not using all cores

我写了一个示例脚本,在重新安装 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)))

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

在此处输入图像描述

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM