import os
m = 'foo\n'
n = 'bar\n'
with open('test2.txt', 'w') as f:
f.write(m)
os.fork()
f.write(n)
输出让我感到困惑:
foo
bar
foo
bar
但是,我的期望是:
foo
bar
bar
然后,我改变了打开文件的方式:
import os
m = 'foo\n'
n = 'bar\n'
fd = os.open('test2.txt', os.O_RDWR)
os.write(fd, m)
os.fork()
os.write(fd, n)
os.close(fd)
这就像我预期的那样有效。
with
时,fork
是否存在问题?
答案 0 :(得分:3)
Python默认情况下缓冲文件,当你分叉时,如果缓冲区没有被刷新,那么两个进程都会认为它们负责稍后刷新缓冲区,包括fork之前的部分。如果在fork之前添加显式调用以刷新流:
f.flush()
然后foo
将被写出来,缓冲区将被清空,准备让父母和新孩子同时写bar
而不携带foo
。< / p>