Aprendendo sobre multiprocessamento Python (de um artigo PMOTW ) e adoraria alguns esclarecimentos sobre o que exatamente o join()
método está fazendo.
Em um antigo tutorial de 2008 afirma que sem a p.join()
chamada no código abaixo, "o processo filho ficará ocioso e não será encerrado, tornando-se um zumbi que você deve matar manualmente".
from multiprocessing import Process
def say_hello(name='world'):
print "Hello, %s" % name
p = Process(target=say_hello)
p.start()
p.join()
Eu adicionei uma impressão do PID
e também um time.sleep
para testar e, pelo que eu posso dizer, o processo termina sozinho:
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()
dentro de 20 segundos:
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
após 20 segundos:
947 ttys001 0:00.13 -bash
O comportamento é o mesmo com p.join()
adicionado de volta no final do arquivo. O Módulo Python da Semana oferece uma explicação muito legível do módulo ; "Para esperar até que um processo conclua seu trabalho e saia, use o método join ().", Mas parece que pelo menos o OS X estava fazendo isso de qualquer maneira.
Também estou me perguntando sobre o nome do método. O .join()
método está concatenando alguma coisa aqui? É concatenar um processo com seu fim? Ou ele apenas compartilha um nome com o .join()
método nativo do Python ?
CPU, Memory resources
estão sendo separados do processo pai e, em seguida, join
removidos novamente após a conclusão do processo filho?