Python多个用户同时附加到同一文件

Ray*_*y Y 24 python concurrency simultaneous text-files simultaneous-calls

我正在研究一个可以通过网络访问的python脚本,因此会有多个用户试图同时附加到同一个文件.我担心这可能导致竞争条件,如果多个用户同时写入同一文件,它可能会损坏文件.

例如:

#!/usr/bin/env python

g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close
Run Code Online (Sandbox Code Playgroud)

我是否必须使用锁定文件,因为此操作看起来很危险.

phi*_*hag 33

您可以使用文件锁定:

import fcntl
new_entry = "foobar"
with open("/somepath/somefile.txt", "a") as g:
    fcntl.flock(g, fcntl.LOCK_EX)
    g.write(new_entry)
    fcntl.flock(g, fcntl.LOCK_UN)
Run Code Online (Sandbox Code Playgroud)

请注意,在某些系统上,则锁定需要,如果你只写小的缓冲区,因为附加在这些系统上是原子.

  • 如果用户尝试追加到文件但文件被集群锁定,会发生什么情况?错误? (3认同)
  • 非常感谢您的帮助!我无法使用“buffering=0”,因为我没有以二进制模式打开文件,但在释放锁之前在文件描述符上使用“flush”解决了问题。 (3认同)
  • 很好的答案,为什么你需要在这里执行 g.seek(0,2) 才能转到 EOF。追加不会只是添加到文件末尾吗? (2认同)
  • @RayY不,进程(或更确切地说,当前线程)只是阻塞,直到释放锁.有关更多信息,请参阅[`man 2 flock`](http://www.kernel.org/doc/man-pages/online/pages/man2/flock.2.html) (2认同)
  • @Flint 不,阻塞意味着 `flock` 在获得锁之前不会返回。 (2认同)
  • 会不会出现这种情况:进程A和B都以追加模式打开文件。A 获取锁,写入,然后解锁。B 现在获得锁并覆盖 A 写入的内容,因为当调用“open”时,文件末尾是现在由 A 写入的行。我正在尝试写入一个包含 175 个进程的文件,有些行被搞乱了,即使它们在属于每个进程的各个日志文件中正确打印,所以我想知道这是否可能是问题所在。我需要调用seek或其他方法来移动到B的文件末尾吗?(我使用的是 Debian 10,Python 3.7.5) (2认同)

use*_*754 6

如果您在 Linux 上执行此操作,并且缓存大小小于 4KB,则写入操作是原子的,您应该没问题。

更多内容请阅读: Unix 中的文件追加是原子的吗?


Qia*_*iau 5

您没有说明您使用的平台,但这里有一个您可以使用的跨平台模块: Python 中的文件锁定

  • 不,不是,只是休息而已。 (14认同)