Imparando a conoscere il multiprocessing di Python (da un articolo di PMOTW ) e mi piacerebbe qualche chiarimento su cosa join()sta facendo esattamente il metodo.
In un vecchio tutorial del 2008 si afferma che senza la p.join()chiamata nel codice seguente, "il processo figlio resterà inattivo e non terminerà, diventando uno zombi che devi uccidere manualmente".
from multiprocessing import Process
def say_hello(name='world'):
print "Hello, %s" % name
p = Process(target=say_hello)
p.start()
p.join()
Ho aggiunto una stampa del PIDcosì come un time.sleeptest e per quanto ne so, il processo termina da solo:
from multiprocessing import Process
import sys
import time
def say_hello(name='world'):
print "Hello, %s" % name
print 'Starting:', p.name, p.pid
sys.stdout.flush()
print 'Exiting :', p.name, p.pid
sys.stdout.flush()
time.sleep(20)
p = Process(target=say_hello)
p.start()
# no p.join()
entro 20 secondi:
936 ttys000 0:00.05 /Library/Frameworks/Python.framework/Versions/2.7/Reso
938 ttys000 0:00.00 /Library/Frameworks/Python.framework/Versions/2.7/Reso
947 ttys001 0:00.13 -bash
dopo 20 secondi:
947 ttys001 0:00.13 -bash
Il comportamento è lo stesso con l' p.join()aggiunta di nuovo alla fine del file. Python Module of the Week offre una spiegazione molto leggibile del modulo ; "Per aspettare che un processo abbia completato il suo lavoro ed è uscito, usa il metodo join ().", Ma sembra che almeno OS X lo stesse facendo comunque.
Mi chiedo anche il nome del metodo. Il .join()metodo concatena qualcosa qui? Sta concatenando un processo con la sua fine? O condivide semplicemente un nome con il .join()metodo nativo di Python ?
CPU, Memory resourcesviene separato dal processo genitore, quindi joinreinserito di nuovo dopo che il processo figlio è stato completato?