【问题标题】:Python Multiple users append to the same file at the same timePython 多个用户同时追加到同一个文件
【发布时间】:2012-08-04 21:58:38
【问题描述】:

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

例如:

#!/usr/bin/env python

g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close

我是否必须为此使用锁定文件,因为此操作看起来有风险。

【问题讨论】:

  • 也许你可以只使用系统日志?
  • 如果您使用的是 Linux 或其他 Unix,mkfifo 可能是一个有趣的选择。 mkfifo 创建一个 FIFO 特殊文件。任何人都可以随机写入文件,然后一个进程从 FIFO 中读取。这样你就不需要使用文件锁定了。
  • 如果您使用O_APPEND 打开,目标文件系统是 POSIX 兼容的,并且您的写入都足够短,可以在单个系统调用中完成,首先不会有损坏。

标签: python concurrency text-files simultaneous simultaneous-calls


【解决方案1】:

你可以使用file locking:

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)

请注意,在某些系统上,如果您只编写小缓冲区,则不需要锁定,因为appends on these systems are atomic

【讨论】:

  • 很好的答案,为什么你需要在这里做一个 g.seek(0,2) 去 EOF。不会追加只是添加到文件的末尾?
  • 哦,你是对的。至少在 Linux 上,它不是必需的(我想象一个操作系统通过最初寻求 EOF 来实现 a 模式)。我也在玩用另一种模式打开文件的想法,但a,但这显然在 Python 中是不可能的。
  • 如果用户尝试追加到文件但文件被flock锁定会发生什么?错误?
  • @RayY 不,进程(或更准确地说,当前线程)只是阻塞,直到锁被释放。更多信息请参考man 2 flock
  • @Flint 不,阻塞意味着flock 在获得锁之前不会返回。
【解决方案2】:

如果你在 Linux 上做这个操作,并且缓存大小小于 4KB,写操作是原子的,你应该没问题。

阅读更多: Is file append atomic in UNIX?

【讨论】:

    【解决方案3】:

    根据您的平台/文件系统位置,这可能无法以安全的方式进行(例如 NFS)。也许您可以写入不同的文件并在之后合并结果?

    【讨论】:

      【解决方案4】:

      您没有说明您使用的平台,但这里有一个您可以使用的跨平台模块: File locking in Python

      【讨论】:

      • 此链接已失效。
      • 不,不是,只是在休息。
      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 2012-10-18
      • 2020-01-30
      • 2017-03-10
      • 1970-01-01
      • 2023-03-19
      • 2018-12-16
      相关资源
      最近更新 更多