multiprocessing.Process()或multiprocessing.Pool()会更均匀地分布在核心上吗?

时间:2013-08-13 22:36:32

标签: python multithreading python-2.7 python-multithreading

创建流程池之间是否存在任何差异(以任何方式),或者只是循环流程以创建更多流程?

这有什么区别?:

pool = multiprocessing.Pool(5)
pool.apply_async(worker)
pool.join()

这个?:

procs = []
for j in range(5):
        p = multiprocessing.Process(worker)
        p.start()
        procs.append(p)

for p in procs:
    p.join()

池更有可能使用更多内核/处理器吗?

1 个答案:

答案 0 :(得分:4)

池的apply_async方法只会在池中任意选择的进程上运行worker函数一次,因此您的两个代码示例将不会完全相同。要真正相同,您需要拨打apply_async五次。

我认为哪种方法更适合给予任务取决于你正在做什么。 multiprocessing.Pool允许您为每个进程执行多个作业,这可以更轻松地并行化您的程序。例如,如果您有一百万个需要单独处理的项目,您可以创建一个具有合理数量的进程的池(可能与您拥有CPU核心数一样多),然后将百万个项目的列表传递给pool.map 。池将它们分发到各种工作进程(并收集返回值以返回到父进程)。启动一百万个单独的流程将不太实际(它可能会破坏您的操作系统)。

另一方面,如果您要并行完成少量工作,并且您只需要完成一次工作,那么对每项工作使用单独的multiprocessing.Process可能是完全合理的,而不是建立一个游泳池,启动工作,然后拆除游泳池。