原子访问的文件锁定不起作用



因此,我想执行一些代码,这些代码必须是Python中不同运行程序的原子代码。为此,我考虑使用文件锁。

然而,它不起作用。在下面的代码中,我要做的是打印一条作为参数给出的消息,然后等待30秒再解锁文件。在这种情况下,如果我运行两个实例,第二个实例将不得不等待该时间来打印消息。但事实并非如此,因为这两个实例都会立即打印消息。

我犯了什么错误?

message = sys.argv[1]
lock_file = "test.lock"
_flock = None
def _lock_file():
_flock = open(lock_file, 'w+')
while True:
try:
fcntl.flock(_flock, fcntl.LOCK_EX | fcntl.LOCK_NB)
break
except IOError as e:
# raise on unrelated IOErrors
if e.errno != errno.EAGAIN:
raise
else:
time.sleep(0.1)

def _unlock_file():
if _flock != None:
fcntl.flock(_flock, fcntl.LOCK_UN)
_lock_file()
print(message)
time.sleep(30)
_unlock_file()

对我来说,下面的方法很有效,为什么有while True

使用lockf而不是flock。它能更好地处理锁的获取和释放。关键区别在于lockf是一个强制锁。这意味着,当一个进程锁定文件的某个部分时,没有其他进程可以访问该文件的该部分。另一方面,flock是一个咨询锁,这意味着进程必须选择同意锁定文件,但内核不会强制执行这样的操作。

import sys
import fcntl
import time
message = sys.argv[1]
lock_file = "test.lock"
_flock = open(lock_file, "w")
def lock_file(f):
fcntl.lockf(f, fcntl.LOCK_EX)
def unlock_file(f):
fcntl.lockf(f, fcntl.LOCK_UN)
lock_file(_flock)
print(message)
time.sleep(30)
unlock_file(_flock)

最新更新