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)
我的处理图像如下。知道什么可能导致这种情况吗?
当您的工作可以拆分为可以分配给多个工作人员的单独工作单元时,工作人员池是一种有效的设计模式。
为此,您需要将输入分成块,并通过某种方式将这些块分发给所有工作人员。将multiprocessing.Pool
操作系统进程用于工作人员,并使用单个操作系统管道作为传输层。
这引入了大量开销,通常称为进程间通信 (IPC) 成本。
在您的具体示例中,您在主流程中使用该random.sample
函数生成了一个大型数据集。仅此一项就需要相当多的资源。然后,您将每个样本发送到一个单独的进程,该进程执行非常简单的计算。
不用说,大部分时间都花在主进程上,它必须生成大量数据,将其划分为大小为 1 的块(因为这是 的默认值pool.imap
)将每个块发送给工作程序并收集返回的值。所有的工作进程基本上都处于空闲状态,等待主进程为他们提供工作。
如果您尝试在您的函数上模拟一些计算f
,您会注意到所有内核如何变得忙碌。
归档时间: |
|
查看次数: |
321 次 |
最近记录: |