我正在尝试使用Python的multiprocessing包。在查看教程时,最清晰和直接的技术似乎是使用pool.map,它允许用户轻松命名进程数量并将函数和值列表传递给pool.map以分布在CPU上。我遇到的另一种技术是使用队列来管理工作程序池。这个答案很好地解释了pool.map、pool.apply和pool.apply_async之间的区别,但是使用pool.map和像这个示例中使用队列有什么优缺点呢?
pool.map技术是队列技术的“子集”。也就是说,如果没有pool.map,你可以轻松地使用Pool和Queue来实现它。然而,使用队列使您在控制池进程方面具有更大的灵活性,例如,可以使特定类型的消息在进程生命周期内仅被读取一次,控制池进程的关闭行为等。
如果您真的正在寻找“最清晰和最直接的技术”,使用 concurrent.futures.ProcessPoolExecutor 可能是最简单的方法。它有一个map方法以及其他一些基本操作,使其非常易于使用。它还兼容Queue。
pool.map
在完成任务后会自动关闭进程吗? - Michael当池对象被垃圾回收时,会立即调用terminate()方法。
。但是我们不能完全依赖这个特性,最好在应用程序结束时确保已关闭池。否则,你可能会在系统中留下一些僵尸进程。至于pool.map
操作-不会关闭进程。只有当他们的进程池关闭或变为孤儿进程时,这些进程才会终止。 - Maciej Gol