3

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

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 值没有一起打印。有没有办法避免这种情况?谁能解释这里发生了什么以及如何避免它?

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

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

4

2 回答 2

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()

注释掉with lock:

003023120134201342013420314203140231402134203140231420134021342031402134201342013420314203142
1342
14

4

如所写:

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

也许在运行程序之前设置这个变量会对你有所帮助,它会在每次写入后强制 python 刷新到标准输出:

export PYTHONUNBUFFERED=1

另请参阅:禁用输出缓冲

于 2013-10-01T07:30:01.887 回答