在并发环境中向文件末尾追加内容
为了确保当多个相同的程序同时运行时,"完整"的行总是能正确地添加到文件的末尾,我们需要采取哪些步骤呢?
#!/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 个回答
10
我觉得关于Python的普通open
函数的这个“bug”的讨论表明,使用这个函数时,你不能保证操作是原子性的,也就是说可能会出现一些不一致的情况。但是如果你使用下面这个方法,就可以得到这种保证:
with io.open('myfile', 'a') as f:
f.write('stuff')
http://docs.python.org/2/library/io.html#io.open
前提是操作系统正确地实现了它的写入系统调用……