以下のコード、および子プロセスで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
解決策を教えていただけますか?前もって感謝します。
これを試して:
from multiprocessing import Process
import sys
def f(name):
print 'hello', name
sys.stdout.flush()
...
AFAIKは、multiprocessing
モジュールによって生成された処理済みの標準出力がバッファリングされるため、バッファがいっぱいになるか、sys.stdout
を明示的にフラッシュした場合にのみ出力が表示されます。
マルチプロセッシングのドキュメントは明確に説明しています なぜ これは機能しません!
「注:このパッケージ内の機能では、__ main__メソッドが子によってインポート可能である必要があります。これはプログラミングガイドラインで説明されていますが、ここで指摘する価値があります。これは、マルチプロセッシングなどの一部の例を意味します。プールの例は、インタラクティブな通訳。」
自分でこの問題に遭遇した場合、これは、子プロセスが実際にprintステートメントに到達する前にサイレントに失敗していることが原因である可能性があります。この場合、子プロセスコードをtry-exceptブロックでラップし、例外オブジェクト(親プロセスで出力される)を返すことは、これをデバッグするための効果的な方法です。