首页 > 解决方案 > 用于原子访问的文件锁定不起作用

问题描述

所以,我想从 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()

标签: pythonlinuxfile-locking

解决方案


对我来说,下面的作品,为什么有一个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)

推荐阅读