附加到并发环境中的文件末尾

时间:2011-09-26 21:39:45

标签: python linux append

如果以下多个(示例)程序同时运行,则需要采取哪些步骤来确保“完整​​”行始终正确附加到文件末尾。

#!/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()

并且:即使磁盘已满,或“ulimit -f”已设置,是否可以保证“全部或全部”附加(在linux / unix上)?

(注意类似的问题:How do you append to a file?

2 个答案:

答案 0 :(得分:7)

我认为在python的普通open函数中对this "bug"的讨论表明你没有获得POSIX原子保证,但如果你使用

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

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

如果操作系统正确实现其write sys调用...

http://bugs.python.org/issue15723

答案 1 :(得分:3)

您必须锁定该文件,以确保没有其他人同时写入该文件。有关详细信息,请参阅File Lockinglockfileposixfile

更新:如果磁盘已满,则无法在文件中写入更多数据。我不确定Python的输出重定向实现,但write系统调用可以写入比请求更少的字节。