[英]multiprocessing not using all cores
当您的工作可以拆分为可以分配给多个工作人员的独立工作单元时,工作人员池是一种有效的设计模式。
为此,您需要将输入分成块,并通过某种方式将这些块分配给所有工作人员。 multiprocessing.Pool
为工作人员使用操作系统进程,并使用单个操作系统 pipe 作为传输层。
这引入了显着的开销,通常称为进程间通信 (IPC) 成本。
在您的具体示例中,您在主流程中使用random.sample
function 生成一个大型数据集。 仅此一项就需要相当多的资源。 然后,您将每个样本发送到一个单独的进程,该进程执行非常简单的计算。
不用说,大部分时间都花在必须生成大量数据的主进程上,将其分成大小为 1 的块(因为这是pool.imap
的默认值)将每个块发送到工人并收集返回的值。 所有工作进程基本上都处于空闲状态,等待主进程为他们提供工作。
如果您尝试在 function f
上模拟一些计算,您会注意到所有内核如何变得忙碌。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.