子進程沒法從標準輸入讀取數據

每一個process對象最多隻能調用一次start()方法,join([timeout])方法會阻塞調用process對象的進程,直到timeout時間超時,或者process進程退出。若是timeout設置爲None,則無超時時間。對於linux操做系統的進程管理,父進程會等待子進程退出,並收回子進程的資源,而後父進程再退出。若是父進程先於子進程退出,則子進程會被init進程接管。若是父進程沒有退出也沒有回收子進程資源,則子進程會一直停留在僵死狀態。這裏join方法就是阻塞父進程,等待子進程執行完畢。linux

若是在子進程裏面要接受標準輸入(如調用raw_input函數),這時候會有問題。由於標準輸入是被父進程佔用,所以這裏子進程沒法從標準輸入讀取數據。ide

一個解決辦法是將標準輸入描述符,傳入子進程函數:函數

from multiprocessing import Processui

import sys, osspa

import time操作系統


def intask(x, fileno):orm

    sys.stdin = os.fdopen(fileno)對象

    while True:進程

        in_char = raw_input("Enter to continue, Q to quit: ")ip

        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()

相關文章
相關標籤/搜索