gpt4 book ai didi

Python fcntl 未按预期锁定

转载 作者:IT老高 更新时间:2023-10-28 20:25:23 25 4
gpt4 key购买 nike

在基于 Debian 的操作系统(Ubuntu、Debian Squeeze)上,我使用 Python(2.7、3.2)fcntl 来锁定文件。据我了解,fnctl.flock 以某种方式锁定文件,如果另一个客户端想要锁定同一个文件,则会引发异常。

我构建了一个小示例,我希望它会引发异常,因为我首先锁定了文件,然后立即尝试再次锁定它:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX)
try:
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
print("can't immediately write-lock the file ($!), blocking ...")
else:
print("No error")

但该示例仅打印“无错误”。

如果我将此代码拆分为同时运行的两个客户端(一个锁定然后等待,另一个在第一个锁定已经激活后尝试锁定),我会得到相同的行为 - 完全没有效果。

这种行为的解释是什么?

编辑:

根据 nightcracker 的要求进行更改,此版本也打印“无错误”,尽管我不希望这样:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import fcntl
import time
fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
try:
fcntl.flock(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
print("can't immediately write-lock the file ($!), blocking ...")
else:
print("No error")

最佳答案

旧帖子,但如果其他人找到它,我会得到这种行为:

>>> fcntl.flock(open('test.flock', 'w'), fcntl.LOCK_EX)
>>> fcntl.flock(open('test.flock', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
# That didn't throw an exception

>>> f = open('test.flock', 'w')
>>> fcntl.flock(f, fcntl.LOCK_EX)
>>> fcntl.flock(open('test.flock', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 35] Resource temporarily unavailable
>>> f.close()
>>> fcntl.flock(open('test.flock', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)
# No exception

在第一种情况下,文件在第一行之后被关闭,大概是因为文件对象不可访问。关闭文件会释放锁。

关于Python fcntl 未按预期锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9907616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com