用于原子访问的文件锁定不起作用
Posted
技术标签:
【中文标题】用于原子访问的文件锁定不起作用【英文标题】:File lock for atomic access does not work 【发布时间】:2020-02-26 00:25:30 【问题描述】:所以,我想从 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()
【问题讨论】:
它的 Linux 操作系统,我只需要它用于 Linux。 【参考方案1】:对我来说,下面的工作,为什么有一个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)
【讨论】:
我认为while True
循环是因为OP想等到文件可用,然后再做一些处理。
这也会等待;不同之处在于,如果您想尝试做其他事情(除了睡觉)同时等待。
@SyntaxVoid 当您获得排他锁时,其他进程将不得不等待直到文件被释放。以上是关于用于原子访问的文件锁定不起作用的主要内容,如果未能解决你的问题,请参考以下文章