在python中使进程一次输出一个

Abh*_*ogi 3 python stdout multiprocessing

我正在使用Poolundermultiprocessing做一些事情。

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

在某些情况下,一个进程的 a、b、c 的值没有一起打印。有没有办法避免这种情况?谁能解释一下这里发生了什么以及如何避免?

我的理解是,如果我删除打印中的所有换行符并在最后只保留一个换行符,它应该可以解决问题。(问题是,它不是每次都可以重现,所以我仍在测试东西)。

有没有一种方法可以sys.stdout专门用于一个过程,然后在我打印内容时将其释放STDOUT

Mar*_*nen 5

您可以使用 amultiprocessing.Lock来序列化打印件。在主程序中创建公共锁,并将相同的锁传递给所有子进程。例子:

#!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()
Run Code Online (Sandbox Code Playgroud)

随着with lock:注释掉:

003023120134201342013420314203140231402134203140231420134021342031402134201342013420314203142
1342
14

4
Run Code Online (Sandbox Code Playgroud)

正如所写:

00000000000000000000
11111111111111111111
44444444444444444444
22222222222222222222
33333333333333333333
Run Code Online (Sandbox Code Playgroud)