Python 从多个单独的 Python 进程写入文件,我必须锁定文件吗?

Python writing to file from multiple separate Python processes, do I have to lock file?

我有一个 Python 脚本,它始终 运行 在许多不同的 Kubernetes pods 中运行(同时最少 1 个,最多 ~100 个)。

这些进程在很大程度上是相互独立的,除了在某一时刻,它们必须按以下方式写入同一个文件 (last_appended.txt):

with open(filepath, 'w') as file:
    file.write(str(int(time.timestamp())))

我想知道我是否必须对该文件进行任何类型的锁定,或者这是一个没有必要的最小操作?

如果我想锁定文件,我找到了以下代码来启用它:

with open(filepath, 'w') as file:
        fcntl.flock(file, fcntl.LOCK_EX)
        file.write(str(int(time.timestamp())))
        fcntl.flock(file, fcntl.LOCK_UN)

但是,我想知道这是否足以让我的进程 运行 顺利进行,或者我可能必须在进程遇到锁时编写某种 try/except 循环。

总而言之,我的问题有两个方面:

  1. 我是否必须完全锁定文件,或者这是一个很小的操作,可以由多个进程完成而不会崩溃,并且
  2. 如果不是,我对多进程写入文件的解决方案是否足够?

无关:在这种情况下使用 w 模式很奇怪,你不是说这里的 a 模式吗?


因为你正在使用 fcntl 我将在这里假设一个类 Unix 系统

如果不使用锁,就会出现所谓的竞争条件。这意味着在小负载下,问题的风险接近于 0,但在更高的负载下可能会增加。这是系统管理员讨厌的事情,因为它会导致不可重现的问题。

一把锁确实会消耗一些资源,但在正常负载下(非锁定版本不会遇到任何问题),不会争用那把锁,所以应该不会引起注意。大负载下,防止两个进程同时写乱码。

如果你想防止在重负载下发生争用,你可以等待一个短的超时。在许多系统上很容易,或者需要在其他一些系统上明确调用 alarm。如果可以获取锁,则继续写入文件。否则,跳过该写入,并在可能的情况下(在其他地方)记录错误情况以供以后分析。

您需要锁定整个写入文件的过程:

fcntl.flock(file, fcntl.LOCK_EX)
with open(filepath, 'w') as file:
    file.write(str(int(time.timestamp())))
fcntl.flock(file, fcntl.LOCK_UN)