我正在尝试使用Python的multiprocessing.Pool对象来理解最佳实践。
在我的程序中,我经常使用Pool.imap。通常每次我并行启动任务时,我都会创建一个新的池对象,然后在完成后关闭它。
我最近遇到了挂起,其中提交到池的任务数量少于进程数。奇怪的是它只发生在我的测试管道中,它之前运行了很多东西。作为独立运行测试不会导致手。我认为它与制作多个池有关。
我真的想找一些资源来帮助我理解使用Python多处理的最佳实践。具体来说,我目前正在尝试理解制作几个池对象与仅使用一个池对象的含义。
答案 0 :(得分:4)
创建工作进程池时,将从父进程生成新进程。这是一个非常快速的操作,但它有它的成本。
因此,只要你没有一个很好的理由,例如由于一个工人意外死亡导致Pool中断,最好始终使用相同的Pool实例。
如果不检查代码,很难说是挂起的原因。您可能没有正确清理以前的实例(调用close()/ stop()然后总是调用join())。您可能通过Pool通道发送了太大的数据,这通常会导致死锁等等。
如果你提交的任务少于工人,那么游泳池肯定不会破裂。该池的设计完全是为了解决工作人员数量中的任务数量。