多处理时在哪里调用join()

时间:2018-09-19 15:37:35

标签: python python-multiprocessing

在Python中使用多处理时,我通常会看到一些示例,其中join()函数是在一个单独的循环中调用的,该循环实际上是每个进程的创建位置。

例如,此:

processes = []

for i in range(10):
    p = Process(target=my_func)
    processes.append(p)
    p.start()

for p in processes:
    p.join()

比这更常见:

processes = []

for i in range(10):
    p = Process(target=my_func)
    processes.append(p)
    p.start()
    p.join()

但是据我对join()的理解,它只是告诉脚本在该过程完成之前不要退出。因此,何时调用join()无关紧要。那么为什么通常在单独的循环中调用它?

1 个答案:

答案 0 :(得分:5)

join()正在阻止操作。

在第一个示例中,您启动了10个进程,然后等待所有过程完成。 所有进程正在同时运行。

在第二个示例中,您一次启动一个进程,然后等待完成,然后再启动另一个进程。 同时只有一个正在运行的进程

第一个示例:

def wait()
    time.sleep(1)

# You start 10 processes
for i in range(10):
    p = Process(target=wait)
    processes.append(p)
    p.start()

# One second after all processes can be finished you check them all and finish
for p in processes:
    p.join()

整个脚本的执行时间可以接近一秒

第二个示例:

for i in range(10):
    p = Process(target=wait) # Here you start one process 
    processes.append(p)
    p.start()
    p.join() # Here you will have to wait one second before process finished.

整个脚本的执行时间可以接近 10秒!