每個process對象最多隻能調用一次start()方法,join([timeout])方法會阻塞調用process對象的進程,直到timeout時間超時,或者process進程退出。如果timeout設置爲None,則無超時時間。對於linux操作系統的進程管理,父進程會等待子進程退出,並收回子進程的資源,然後父進程再退出。如果父進程先於子進程退出,則子進程會被init進程接管。如果父進程沒有退出也沒有回收子進程資源,則子進程會一直停留在僵死狀態。這裏join方法就是阻塞父進程,等待子進程執行完畢。
如果在子進程裏面要接受標準輸入(如調用raw_input函數),這時候會有問題。因爲標準輸入是被父進程佔用,因此這裏子進程無法從標準輸入讀取數據。
一個解決辦法是將標準輸入描述符,傳入子進程函數:
from multiprocessing import Process
import sys, os
import time
def intask(x, fileno):
sys.stdin = os.fdopen(fileno)
while True:
in_char = raw_input("Enter to continue, Q to quit: ")
if in_char.upper() == 'Q':
break
print x * x
if __name__ == '__main__':
fn = sys.stdin.fileno()
arg = 5
p = Process(target = intask, args = (arg, fn))
p.start()
p.join()