2017-09-29 130 views
0

我已經通過了幾十個這裏的「Python子流程掛起」文章,並認爲我已經解決了下面代碼中各種文章中提出的所有問題。當管道輸出時,Python子流程像Popen一樣掛起

我的代碼間歇性地掛在Popen命令上。我使用multiprocessing.dummy.apply_async運行4個線程,每個線程啓動一個子進程,然後逐行讀取輸出並將其修改版本打印到標準輸出。

def my_subproc(): 
    exec_command = ['stdbuf', '-i0', '-o0', '-e0', 
        sys.executable, '-u', 
        os.path.dirname(os.path.realpath(__file__)) + '/myscript.py'] 

    proc = subprocess.Popen(exec_command, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1) 
    print "DEBUG1", device 

    for line in iter(proc.stdout.readline, b''): 
    with print_lock: 
     for l in textwrap.wrap(line.rstrip(), LINE_WRAP_DEFAULT): 

上面的代碼從apply_async運行:

pool = multiprocessing.dummy.Pool(4) 
for i in range(0,4): 
    pool.apply_async(my_subproc) 

間歇子進程將掛起在subprocess.Popen,語句 「DEBUG1」 不打印。有時候所有的線程都可以工作,有時只有4個工作中的1個工作。

我不知道這表現出Popen已知的任何死鎖情況。我錯了嗎?

回答

0

這似乎是與multiprocessing.dummy的不良交互。當我使用多處理(不是.dummy線程接口)時,我無法重現錯誤。