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 PID
così come un time.sleep
test 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 resources
viene separato dal processo genitore, quindi join
reinserito di nuovo dopo che il processo figlio è stato completato?