En savoir plus sur le multitraitement Python (à partir d'un article de PMOTW ) et j'aimerais avoir des éclaircissements sur ce que fait exactement la join()
méthode.
Dans un ancien tutoriel de 2008, il indique que sans l' p.join()
appel dans le code ci-dessous, "le processus enfant restera inactif et ne se terminera pas, devenant un zombie que vous devez tuer manuellement".
from multiprocessing import Process
def say_hello(name='world'):
print "Hello, %s" % name
p = Process(target=say_hello)
p.start()
p.join()
J'ai ajouté une impression du PID
ainsi qu'un time.sleep
pour tester et pour autant que je sache, le processus se termine tout seul:
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()
dans les 20 secondes:
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
après 20 secondes:
947 ttys001 0:00.13 -bash
Le comportement est le même avec l' p.join()
ajout à la fin du fichier. Le module Python de la semaine offre une explication très lisible du module ; "Pour attendre qu'un processus ait terminé son travail et se soit arrêté, utilisez la méthode join ().", Mais il semble qu'au moins OS X le fasse de toute façon.
Je me demande aussi le nom de la méthode. La .join()
méthode concatène-elle quelque chose ici? S'agit-il de concaténer un processus avec sa fin? Ou partage-t-il simplement un nom avec la .join()
méthode native de Python ?
CPU, Memory resources
sont séparés du processus parent, puis sont join
à nouveau modifiés une fois le processus enfant terminé?