【发布时间】:2016-08-19 00:18:41
【问题描述】:
[我很难在 Linux 上使用 python 3 实现线程/进程安全的解决方案来获取文件锁(我不关心可移植的解决方案,因为我正在开发的程序广泛使用Linux 内核专有容器化技术)。]
阅读http://apenwarr.ca/log/?m=201012#13后,我决定使用fcntl.lockf()锁定一个文件以供进程独占访问,并编写了以下函数:
import contextlib as Contextlib
import errno as Errno
import fcntl as Fcntl
import os as Os
@Contextlib.contextmanager
def exclusiveOpen(filename,
mode):
try:
fileDescriptor = Os.open(filename,
Os.O_WRONLY | Os.O_CREAT)
except OSError as e:
if not e.errno == Errno.EEXIST:
raise
try:
Fcntl.lockf(fileDescriptor,
Fcntl.LOCK_EX)
fileObject = Os.fdopen(fileDescriptor,
mode)
try:
yield fileObject
finally:
fileObject.flush()
Os.fdatasync(fileDescriptor)
finally:
Os.close(fileDescriptor)
除此之外,我确定它是不正确的(为什么它不阻止Fcntl.lockf(fileDescriptor, Fcntl.LOCK_EX)?),最让我感到不安的部分是获取fileDescriptor 的位置 - 如果文件是不存在的,它被创建了......但是如果两个进程同时执行这部分,会发生什么?是否存在竞争条件,两个线程都尝试创建文件?如果是这样,人们怎么可能阻止这种情况 - 当然不是使用另一个锁定文件(?),因为它必须以相同的方式创建(?!?!)我迷路了。任何帮助是极大的赞赏。
更新:发布了解决潜在问题的另一种方法。我在这种方法中看到的问题是,过程名称不能等于现有 UNIX 域套接字的名称(可能由另一个程序创建) - 我对此是否正确?
【问题讨论】:
标签: python linux python-3.x thread-safety lockfile