我在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
时将其释放?
答案 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