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

Kar*_*rus 1 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()
Run Code Online (Sandbox Code Playgroud)

比这更常见:

processes = []

for i in range(10):
    p = Process(target=my_func)
    processes.append(p)
    p.start()
    p.join()
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*tný 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()
Run Code Online (Sandbox Code Playgroud)

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

第二个例子:

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.
Run Code Online (Sandbox Code Playgroud)

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