Дізнавшись про багатопроцесорну програму 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 пропонує дуже читабельне пояснення модуля ; "Щоб зачекати, поки процес завершить свою роботу і не завершиться, використовуйте метод join ().", Але, схоже, принаймні OS X так чи інакше робила це.
Я також цікавлюсь назвою методу. Чи є тут .join()
метод, що поєднує щось? Це поєднує процес з його закінченням? Або це просто поділяє ім'я з рідним .join()
методом Python ?
CPU, Memory resources
відокремлюються від батьківського процесу, а потім join
знову повертаються після завершення дочірнього процесу?