【发布时间】:2016-06-04 19:03:02
【问题描述】:
我在服务器上有一个文件results.txt,多个虚拟机通过 NFS 访问该文件。每个虚拟机上都运行一个进程,该进程读取results.txt 文件并对其进行修改。如果A 和B 两个进程同时读取文件,则根据进程写入文件的顺序,A 或B 的修改将出现在results.txt 中。
如果进程A 对文件有写锁,那么进程B 必须等到锁被释放才能读取results.txt 文件。
我已尝试使用 Python 实现此功能:
import fcntl
f = open("/path/result.txt")
fcntl.flock(f,fcntl.LOCK_EX)
#code
它对本地磁盘上的文件按预期工作。
但是当我运行尝试锁定挂载路径上的文件时,我收到以下错误:
Traceback (most recent call last):
File "lock.py", line 12, in <module>
fcntl.flock(f,fcntl.LOCK_EX)
IOError: [Errno 45] Operation not supported
我尝试了fcntl.fcntl 和fcntl.flock,但得到了同样的错误。这是我使用fcntl 的方式的问题吗?存储文件的服务器是否需要任何配置?
编辑:
这就是我使用fcntl.fcntl的方式:
f= open("results.txt")
lockdata = struct.pack('hhllhh', fcntl.F_RDLCK,0,0,0,0,0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
NFS 服务器版本为 3。
【问题讨论】:
-
你能粘贴你使用
fcntl.fcntl()的方式吗? -
@vmonteco,我已经添加了代码 sn-p。
-
fcntl.fcntl(f, fcntl.LOCK_EX)工作吗? -
@vmonteco 它没有给出任何错误。但我不认为锁定正在被应用。我可以在两个不同的会话中在同一个文件上运行脚本,并且没有一个等待。
标签: python python-2.7 nfs file-locking fcntl