使用 fcntl 将文件锁定在 Python

File locking in Python with fcntl

我正在尝试定义函数以简化使用 fcntl 模块锁定文件的过程。当我手动 运行

fcntl.lockf(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)

在 Python 的两个独立实例中,我得到了预期的异常

BlockingIOError: [Errno 11] Resource temporarily unavailable

但是当我在 mylock.py 中定义函数来自动执行此操作时:

import fcntl

def lock(filepath):
    lock_file = open(filepath, "a")
    try:
        fcntl.lockf(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
    except OSError or BlockingIOError:
        return False
    return True

def unlock(filepath):
    lock_file = open(filepath, "a")
    try:
        fcntl.lockf(lock_file, fcntl.LOCK_UN)
    except OSError or BlockingIOError:
        return False
    return True

然后将其导入两个单独的 python 实例并执行

mylock.lock("test.txt")

这两种情况都出乎意料 returns True。我的错误处理不当吗?我还尝试了 except IOError:except Exception:except:——我不明白为什么当我 运行 孤立的 fcntl 命令时引发 BlockingIOError 不会导致 except 要执行的逻辑。

所以,问题似乎是文件正在被垃圾回收,因为在函数之后没有使用句柄 lock_file。如果将 return 语句修改为 return lock_file,则可以实现所需的行为。