2017-09-29 15 views
0

私は数十個の「Pythonサブプロセスがハングする」記事を読んできましたが、以下のコードのさまざまな記事に記載されている問題をすべて解決したと思います。出力をパイプするときにPythonのサブプロセスがPopenとしてハングする

Popenコマンドでコードが断続的にハングします。私はmultiprocessing.dummy.apply_asyncを使用して4つのスレッドを実行しています。これらのスレッドはそれぞれサブプロセスを開始し、出力行を1行ずつ読み込み、変更されたバージョンをstdoutに出力します。

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

これは、マルチプロセッシングのダミーとのやりとりが悪いようです。 .dummyスレッドインターフェイスではなくマルチプロセッシングを使用すると、エラーを再現できません。

関連する問題