Python fcntl没有按预期锁定

2024-03-29 10:14:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个基于Debian的操作系统(Ubuntu,Debian-squeze)上,我使用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")

但这个例子只是显示“没有错误”。

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

对这种行为有什么解释?

编辑

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

#!/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")

Tags: 文件importlock客户机usrdebianopentmp
3条回答

旧帖子,但如果有人发现了,我会有这样的行为:

>>> 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

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

我也有同样的问题。。。我把打开的文件放在一个单独的变量中解决了这个问题:

不起作用:

fcntl.lockf(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)

作品:

lockfile = open('/tmp/locktest', 'w')
fcntl.lockf(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)

我认为第一个不起作用,因为打开的文件是垃圾回收的,关闭的,释放的锁。

明白了。脚本中的错误是,我在每次调用时都创建一个新的文件描述符:

fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)
(...)
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)

相反,我必须将file对象分配给一个变量,而不是尝试锁定:

f = open('/tmp/locktest', 'r')
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
(...)
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)

我也得到了我想看到的异常:IOError: [Errno 11] Resource temporarily unavailable。现在我必须考虑在哪些情况下使用fcntl是有意义的。

相关问题 更多 >