使用fcntl在Python中锁定文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用fcntl在Python中锁定文件相关的知识,希望对你有一定的参考价值。

我正在尝试定义函数以简化使用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")

在两个实例中意外地返回True。我的错误处理不合适吗?我也尝试过except IOError:except Exception:except: - 我不明白为什么在我单独运行fcntl命令时引发的BlockingIOError不会导致except逻辑被执行。

答案

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

以上是关于使用fcntl在Python中锁定文件的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

c++ - 互斥锁或群 fcntl.h 锁定只写操作

fcntl和flock两个系统调用的区别

文件锁定程序不锁定文件

python中进程间通讯——文件锁之fcntl模块的使用

我可以让 fcntl 和 Perl 警报合作吗?