使用 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
,则可以实现所需的行为。
我正在尝试定义函数以简化使用 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
,则可以实现所需的行为。