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

时间:2013-10-01 07:22:24

标签: python multiprocessing stdout

我在Pool下使用multiprocessing来做一些事情。

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时将其释放?

2 个答案:

答案 0 :(得分:4)

您可以使用multiprocessing.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

答案 1 :(得分:1)

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

export PYTHONUNBUFFERED=1

另请参阅:Disable output buffering