Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在并发环境中追加到文件末尾_Python_Linux_Append - Fatal编程技术网

Python 在并发环境中追加到文件末尾

Python 在并发环境中追加到文件末尾,python,linux,append,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:

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

#!/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上)进行“全部或无”追加


(注意类似的问题:)

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

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

我认为在Python的正常
open
函数中讨论表明,您没有得到POSIX原子保证,但如果使用

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

如果操作系统正确执行其write sys调用


如果磁盘已满,我不知道如何追加数据。。。你能给溢出来的杯子再加点水吗?除此之外,使用文件锁
flock()
是一个很好的开始。@Marc B-re:“磁盘已满”@。。。很好,我看到“write”系统调用“返回已写入的字节数。如果值为负,则系统调用返回错误。”。我希望“umlimit-f”对“write”也有同样的效果。因此,原子追加可以是½追加,但不能保证完全追加。(我也不记得任何ioctl保证“全部或无”写入文件,即使“记录”很小)写入不是原子的吗?您的行可能与其他进程写入的其他行交错,但只要您最终使用单个
write
syscall(即使其他类型的写入可能被缓冲),这些行本身就应该是完整的。如果您必须写几行需要保持在一起,请先将它们构建成一个字符串。re:“写不是原子的吗?”。。。c、 f.Linux NFS概述、常见问题解答和操作指南文档=>。。。这似乎取决于操作系统和文件系统。这就是甲骨文支付如此高股息的原因!:-)特别注意专门处理O_APPEND的“man”页面摘录:如果设置了文件状态标志的O_APPEND标志,文件偏移量应在每次写入之前设置为文件的末尾,并且在更改文件偏移量和写入操作之间不应发生任何中间文件修改操作。cf本讨论-看起来python的实现与O_APPEND的预期行为并不完全匹配:因此,您的意思是没有理由这样做只要我使用io.open,就使用fctrl.flock?我不知道你到底在做什么,所以我不能给你一个铁一般的保证。但在我看来,如果使用
io.open
'a'
追加模式,您将获得POSIX原子写入保证。但是您应该阅读bug报告和相关链接,以确保它适用于您的用例。这里是龙。我只是有多个脚本在运行,可能在任何时候都想更新文件中的内容。在这种情况下,我传统上认为“您需要一个文件锁”,但有时Python比我预期的要聪明:)我想强调的是,尽管据报道,在正确的情况下,如果操作正确,Windows可以执行原子附件,但Python的
open()
io.open()
并不能保证这一点。