Poznanie wieloprocesorowości w Pythonie (z artykułu PMOTW ) i chciałbym uzyskać wyjaśnienie, co dokładnie join()
robi ta metoda.
W starym samouczku z 2008 roku stwierdza się, że bez p.join()
wywołania w poniższym kodzie „proces potomny będzie siedział bezczynnie i nie zostanie zakończony, stając się zombie, którego należy ręcznie zabić”.
from multiprocessing import Process
def say_hello(name='world'):
print "Hello, %s" % name
p = Process(target=say_hello)
p.start()
p.join()
Dodałem wydruk PID
, a także time.sleep
do badania i ile mogę powiedzieć tego, zakończone jest proces na własną rękę:
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()
w ciągu 20 sekund:
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
po 20 sekundach:
947 ttys001 0:00.13 -bash
Zachowanie jest takie samo w przypadku p.join()
dodania z powrotem na końcu pliku. Python Module of the Week oferuje bardzo czytelne wyjaśnienie modułu ; „Aby poczekać, aż proces zakończy swoją pracę i zakończy pracę, użyj metody join ().”, Ale wygląda na to, że przynajmniej OS X to robił.
Zastanawiam się też nad nazwą metody. Czy .join()
metoda coś tutaj łączy? Czy łączy proces z jego zakończeniem? A może po prostu ma taką samą nazwę jak natywna .join()
metoda Pythona ?
CPU, Memory resources
są oddzielane od procesu nadrzędnego, a następnie join
ponownie odsyłane po zakończeniu procesu potomnego?