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



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

这些进程在很大程度上是相互独立的,除了在某一点上,它们必须以以下方式写入同一个文件(last_appened .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)

最新更新