3

私はいくつかのことをするためにPoolmultiprocessingを使用しています。

def my_func(...):
    #Different processes can take different time
    print a, b, c #Value that I calculated above. (includes 2 new-lines)

プロセスの a、b、c の値が一緒に出力されない場合があります。それを回避する方法はありますか?ここで何が起こっているのか、どうすれば回避できるのか、誰か説明できますか?

私の理解では、プリント内のすべての改行を削除し、最後に 1 つだけ残すと、問題は解決するはずです。(問題は、毎回再現できるわけではないので、まだテスト中です)。

sys.stdoutプロセス専用にして、印刷中にリリースする方法はありSTDOUTますか?

4

2 に答える 2

5

multiprocessing.Locka を使用して、プリントをシリアル化できます。メイン プログラムで共通ロックを作成し、同じロックをすべての子プロセスに渡します。例:

#!python3
from multiprocessing import Process,Lock
import time
import sys

def test(n,lock):
    with lock:
        for i in range(20):
            print(n,end='')
            sys.stdout.flush()
            time.sleep(.01)  # needed some delay or ran too fast and didn't mix output.
        print()

if __name__ == '__main__':
    lock = Lock()
    jobs = [Process(target=test,args=(n,lock)) for n in range(5)]
    for job in jobs:
        job.start()
    for job in jobs:
        job.join()

with lock:コメントアウトした場合:

003023120134201342013420314203140231402134203140231420134021342031402134201342013420314203142
1342
14

4

書かれているとおり:

00000000000000000000
11111111111111111111
44444444444444444444
22222222222222222222
33333333333333333333
于 2013-10-01T07:47:04.150 に答える
0

プログラムを実行する前にこの変数を設定すると役立つ場合があります。これにより、書き込みのたびに python が stdout に強制的にフラッシュされます。

export PYTHONUNBUFFERED=1

参照 :出力バッファリングを無効にする

于 2013-10-01T07:30:01.887 に答える