2013-10-01 24 views
2

我在multiprocessing下使用Pool来做一些事情。在Python中一次处理一个输出

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

+0

如何先简单将它们连接起来?像'''.join([a,b,c])'然后打印结果字符串。 – Igonato

+0

@lgonato,问题是包含换行符的a,b和c的值。这不会解决它,对吧? –

回答

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 
+0

谢谢@Mark,我喜欢它。一旦我在代码中执行它,将接受答案,因为我使用的模块稍有不同。 –

1

运行程序会帮助你,迫使它蟒蛇刷新到stdout每次写操作之后才可能设置这个变量:

export PYTHONUNBUFFERED=1 

参见:Disable output buffering

+0

不完全和答案,但谢谢你告诉它存在。 –