web-dev-qa-db-ja.com

pythonマルチプロセッシングモジュールで作成された子プロセスは出力されません

以下のコード、および子プロセスでprint関数を使用するコードに問題があります。 printの代わりにsys.std[err|out].write('worker')を使用しても、印刷されたステートメントが表示されません。

これはコードです( 公式pythonドキュメント から):

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

出力は空白です。

:次のコードはスレッドモジュールを使用し、出力を出力します。

import threading

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = threading.Thread(target=f, args=('bob',))
    p.start()
    p.join()

出力hello bob

解決策を教えていただけますか?前もって感謝します。

19
John

これを試して:

from multiprocessing import Process
import sys

def f(name):
    print 'hello', name
    sys.stdout.flush()

...

AFAIKは、multiprocessingモジュールによって生成された処理済みの標準出力がバッファリングされるため、バッファがいっぱいになるか、sys.stdoutを明示的にフラッシュした場合にのみ出力が表示されます。

28
Tamás

マルチプロセッシングのドキュメントは明確に説明しています なぜ これは機能しません!

「注:このパッケージ内の機能では、__ main__メソッドが子によってインポート可能である必要があります。これはプログラミングガイドラインで説明されていますが、ここで指摘する価値があります。これは、マルチプロセッシングなどの一部の例を意味します。プールの例は、インタラクティブな通訳。」

6
manifest

自分でこの問題に遭遇した場合、これは、子プロセスが実際にprintステートメントに到達する前にサイレントに失敗していることが原因である可能性があります。この場合、子プロセスコードをtry-exceptブロックでラップし、例外オブジェクト(親プロセスで出力される)を返すことは、これをデバッグするための効果的な方法です。

1
Rob Streeting