在并发环境中向文件末尾追加内容

7 投票
2 回答
6318 浏览
提问于 2025-04-17 03:08

为了确保当多个相同的程序同时运行时,"完整"的行总是能正确地添加到文件的末尾,我们需要采取哪些步骤呢?

#!/usr/bin/env python
import random
passwd_text=open("passwd.txt","a+")
u=("jsmith:x:1001:1000:Joe Smith,Room 1007,(234)555-8917,(234)555-0077,jsmith@rosettacode.org:/home/jsmith:/bin/sh",
  "jdoe:x:1002:1000:Jane Doe,Room 1004,(234)555-8914,(234)555-0044,jdoe@rosettacode.org:/home/jdoe:/bin/sh",
  "xyz:x:1003:1000:X Yz,Room 1003,(234)555-8913,(234)555-0033,xyz@rosettacode.org:/home/xyz:/bin/sh")
for i in range(random.randint(1,2)):
  print >> passwd_text, random.choice(u)
passwd_text.close()

还有:在Linux/Unix系统中,即使磁盘满了或者设置了"ulimit -f",是否能保证“要么全部添加,要么什么都不添加”?

(类似的问题:如何向文件添加内容?

2 个回答

3

你需要锁定文件,这样才能确保没有其他人同时在写这个文件。想了解更多,可以看看 文件锁定锁文件,还有 posixfile 的相关内容。

更新:如果磁盘满了,你就不能再往文件里写数据了。我不太确定Python在输出重定向方面的具体实现,但 write 系统调用可能会写入比请求的字节数还要少的数据。

10

我觉得关于Python的普通open函数的这个“bug”的讨论表明,使用这个函数时,你不能保证操作是原子性的,也就是说可能会出现一些不一致的情况。但是如果你使用下面这个方法,就可以得到这种保证:

with io.open('myfile', 'a') as f:
    f.write('stuff')

http://docs.python.org/2/library/io.html#io.open

前提是操作系统正确地实现了它的写入系统调用……

http://bugs.python.org/issue15723

撰写回答