每個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()
轉載于:https://blog.51cto.com/smileyouth/1903461