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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章