Python 我应该每次创建一个新的池对象还是重用一个池对象?

Python 我应该每次创建一个新的池对象还是重用一个池对象?,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,我试图了解Python的multiprocessing.Pool对象的最佳实践 在我的程序中,我经常使用Pool.imap。通常,每次并行启动任务时,我都会创建一个新的池对象,然后在完成后关闭它 我最近遇到了一个挂起问题,提交到池中的任务数少于进程数。奇怪的是,它只发生在我的测试管道中,在它之前运行了很多东西。作为独立运行测试不会导致手动。我认为这与创建多个池有关 我真的很想找到一些资源来帮助我理解使用Python的多处理的最佳实践。具体地说,我目前正试图理解创建多个池对象而不是只使用一个池对象

我试图了解Python的multiprocessing.Pool对象的最佳实践

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

我最近遇到了一个挂起问题,提交到池中的任务数少于进程数。奇怪的是,它只发生在我的测试管道中,在它之前运行了很多东西。作为独立运行测试不会导致手动。我认为这与创建多个池有关


我真的很想找到一些资源来帮助我理解使用Python的多处理的最佳实践。具体地说,我目前正试图理解创建多个池对象而不是只使用一个池对象的含义

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

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

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


如果你提交的任务少于工人,那么人才库肯定不会破裂。该池的设计完全是为了将任务数与工作线程数解耦。

您是说创建一个工作线程池,然后关闭并加入。稍后您创建了另一个工作线程池,关闭并连接,但它从未完成?你能用一个简短的python脚本复制吗?根据中的指导原则,您只在线程中访问池本身,我也有类似的问题。我在循环中运行一个循环,其中内部循环与Pool.imap并行。它工作很多次,这取决于我向函数提供的数据。但大多数情况下,它挂起时没有错误消息。我一直在试着调试它,但没有找到原因。