使用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中锁定文件的主要内容,如果未能解决你的问题,请参考以下文章