我应该每次都创建一个新的 Pool 对象还是重复使用一个?

Should I create a new Pool object every time or reuse a single one?

我正在尝试了解 Python 的 multiprocessing.Pool 对象的最佳实践。

在我的程序中,我经常使用 Pool.imap。通常,每次我并行启动任务时,我都会创建一个新的池对象,然后在完成后将其关闭。

最近遇到提交到池中的任务数小于进程数的挂起。奇怪的是它只发生在我的测试管道中,它前面有一堆东西运行。 运行 独立测试没有导致手牌。我认为这与制作多个池有关。

我真的很想找到一些资源来帮助我了解使用 Python 的多处理的最佳实践。具体来说,我目前正在尝试了解制作多个池对象与仅使用一个池对象的含义。

当您创建工作进程池时,新进程会从父进程产生。这是一个非常快速的操作,但它有其成本。

因此,只要您没有很好的理由,例如由于一名工作人员意外死亡导致 Pool 中断,最好始终使用相同的 Pool 实例。

不检查代码就很难说出挂起的原因。您可能没有正确清理以前的实例(调用 close()/stop() 然后总是调用 join())。您可能通过 Pool 通道发送了太大的数据,这通常会导致死锁等。

如果您提交的任务少于工作人员,那么池肯定不会中断。该池的设计正是为了将任务数量与工作人员数量分开。