Donde llamar a join () cuando multiprocesamiento

Cuando uso el multiprocesamiento en Python, generalmente veo ejemplos en los que se llama a la función join() en un bucle separado donde se creó realmente cada proceso.

Por ejemplo, esto:

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

Es más común que esto:

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

Pero a mi entender de join() , simplemente le dice al script que no salga hasta que el proceso haya finalizado. Por lo tanto, no debería importar cuando se llama join() . Entonces, ¿por qué se suele llamar en un bucle separado?

join() está bloqueando la operación.

En el primer ejemplo, inicia 10 procesos y luego está esperando que todos los procesos terminen. Todos los procesos se ejecutan al mismo tiempo.

En el segundo ejemplo, inicia un proceso a la vez y está esperando a que termine antes de iniciar otro proceso. Solo hay un proceso en ejecución al mismo tiempo

Primer ejemplo:

 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() 

El tiempo de ejecución de todo el script puede estar cerca de un segundo .

Segundo ejemplo:

 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. 

¡El tiempo de ejecución de todo el script puede ser de cerca de 10 segundos! .