当你的工作可以分成多个单独的工作单位并可以在多个工人之间分配时,Worker Pool是一种有效的设计模式。
为此,您需要将输入划分成块,并通过某些方式将这些块分发给所有工作人员。 multiprocessing.Pool
使用操作系统进程作为工作人员,使用单个操作系统管道作为传输层。
这引入了显着的开销,通常称为进程间通信(IPC)成本。
在您的特定示例中,您在主进程中使用 random.sample
函数生成大型数据集。这本身需要相当多的资源。然后,您将每个样本发送到单独的进程,该进程执行非常简单的计算。
不用说,大部分时间都花在主进程上,它必须生成大量数据,将其划分为默认值为1(因为这是 pool.imap
的默认值)大小的块,将每个块发送到工作人员并收集返回的值。所有工人进程基本上都在等待主进程提供工作。
如果您尝试在f
函数上模拟一些计算,您会注意到所有核心都变得繁忙。
chunksize
参数。 - gold_cyf
,例如def f(x): [x*x for _ in range(10**5)]
。 - Andrey Khoronko