在`with`中分叉时,Python文件写两次

时间:2018-01-26 07:28:59

标签: python-2.7 file fork

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是否存在问题?

1 个答案:

答案 0 :(得分:3)

Python默认情况下缓冲文件,当你分叉时,如果缓冲区没有被刷新,那么两个进程都会认为它们负责稍后刷新缓冲区,包括fork之前的部分。如果在fork之前添加显式调用以刷新流:

f.flush()

然后foo将被写出来,缓冲区将被清空,准备让父母和新孩子同时写bar而不携带foo。< / p>