1

Is there any difference at all (in any way) between creating a pool of processes, or simply looping over a process to create more processes?

What's the difference between this?:

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

and this?:

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

for p in procs:
    p.join()

Will pool be more likely to use more cores/processors?

4

1 回答 1

5

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

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

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

于 2013-08-14T04:37:32.087 回答