Изучая многопроцессорность Python (из статьи PMOTW ), я хотел бы получить некоторые разъяснения о том, что именно join()
делает этот метод.
В старом руководстве от 2008 года говорится, что без p.join()
вызова в приведенном ниже коде «дочерний процесс будет бездействовать и не завершаться, становясь зомби, которого вы должны убить вручную».
from multiprocessing import Process
def say_hello(name='world'):
print "Hello, %s" % name
p = Process(target=say_hello)
p.start()
p.join()
Я добавил распечатку, PID
а также time.sleep
для проверки, и, насколько я могу судить, процесс завершается сам по себе:
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()
в течение 20 секунд:
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
через 20 секунд:
947 ttys001 0:00.13 -bash
Поведение такое же, как и при p.join()
добавлении в конец файла. Python Module of the Week предлагает очень удобочитаемое объяснение модуля ; «Чтобы дождаться, пока процесс завершит свою работу и выйдет, используйте метод join ().», Но похоже, что по крайней мере OS X все равно это делала.
Еще меня интересует название метода. Этот .join()
метод что-нибудь объединяет? Соединяет ли процесс с его концом? Или он просто разделяет имя с собственным .join()
методом Python ?
CPU, Memory resources
данные отделяются от родительского процесса, а затем join
снова возвращаются после завершения дочернего процесса?