portalocker似乎没有锁定

时间:2016-09-02 12:07:24

标签: python python-3.x locking

我有一种检查点文件,我希望有时可以通过各种python程序进行修改。我加载文件,尝试使用portalocker锁定它,更改它,然后解锁并关闭它。

但是,portalocker在最简单的情况下不起作用。 我创建了一个简单的文件:

$echo "this is something here" >> test
$python
Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import portalocker
>>> f = open("test",'w')
>>> portalocker.lock(f, portalocker.LOCK_EX)

同时我仍然可以在另一个终端打开它:

$python
Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> fl = open("test",'w')
>>> fl.write("I can still overwrite this\n")
>>> fl.close()

然后我关闭第一个,并检查文件:

>>> portalocker.unlock(f)
>>> f.close()
>>> 
$ cat test
I can still overwrite this

我做错了什么?

1 个答案:

答案 0 :(得分:4)

问题在于,默认情况下,Linux使用咨询锁。 To enable mandatory locking (which you are referring to) the filesytem needs to be mounted with the mand option。咨询锁定系统实际上有几个优点,但如果你不期待它可能会令人困惑。

为了确保您的代码在两种情况下都能正常运行,我建议用锁定器封装两个打开的调用。

例如,在2个单独的Python实例中尝试:

import portalocker

with portalocker.Lock('test') as fh:
    fh.write('first instance')
    print('waiting for your input')
    input()

现在来自第二个实例:

import portalocker

with portalocker.Lock('test') as fh:
    fh.write('second instance')

Ps:我是portalocker软件包的维护者