首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python fcntl不按预期锁定。

Python fcntl不按预期锁定。
EN

Stack Overflow用户
提问于 2012-03-28 12:36:27
回答 7查看 35.8K关注 0票数 26

在基于Debian的操作系统(Ubuntu,Debian挤压)上,我使用Python (2.7,3.2) fcntl锁定文件。正如我所读到的,fnctl.flock以某种方式锁定了一个文件,如果另一个客户机想要锁定同一个文件,就会抛出异常。

我构建了一个小示例,我希望它会抛出一个例外,因为我首先锁定了文件,然后,紧接着,我尝试再次锁定它:

代码语言:javascript
复制
#!/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")

但是这个例子只是打印“没有错误”。

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

对这种行为的解释是什么?

编辑

根据夜猫子的要求进行更改时,此版本还会打印“无错误”,尽管我并不期望:

代码语言:javascript
复制
#!/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")
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-28 13:56:56

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

代码语言:javascript
复制
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)
(...)
fcntl.flock(open('/tmp/locktest', 'r'), fcntl.LOCK_EX | fcntl.LOCK_NB)

相反,我必须将文件对象赋值给一个变量,而不是试图锁定:

代码语言:javascript
复制
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是有意义的。

票数 11
EN

Stack Overflow用户

发布于 2013-04-10 09:52:38

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

代码语言:javascript
复制
>>> 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

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

票数 18
EN

Stack Overflow用户

发布于 2013-06-29 01:30:05

我也有同样的问题。我解决了它将打开的文件保存在一个单独的变量中的问题:

不起作用:

代码语言:javascript
复制
fcntl.lockf(open('/tmp/locktest', 'w'), fcntl.LOCK_EX | fcntl.LOCK_NB)

作品:

代码语言:javascript
复制
lockfile = open('/tmp/locktest', 'w')
fcntl.lockf(lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB)

我认为第一个文件不能工作,因为打开的文件是垃圾收集的关闭的锁释放的

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9907616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档