我有一个 Thread
扩展类,它应该一次只运行一个实例(跨进程)。为了实现这一点,我正在尝试使用文件锁。以下是我的代码:
class Scanner(Thread):
def __init__(self, path):
Thread.__init__(self)
self.lock_file = open(os.path.join(config.BASEDIR, "scanner.lock"), 'r+')
fcntl.lockf(self.lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
# Stuff omitted
def run(self):
logging.info("Starting scan on %s" % self.path)
# More stuff omitted
fcntl.lockf(self.lock_file, fcntl.LOCK_UN)
如果
lockf
线程已经在运行并且根本没有初始化对象,我希望 Scanner
调用会抛出异常。但是,我可以在终端中看到这一点:INFO:root:Starting scan on /home/felix/Music
INFO:root:Starting scan on /home/felix/Music
INFO:root:Scan finished
INFO:root:Scan finished
这表明两个
Scanner
线程同时运行,没有抛出异常。我确定我在这里遗漏了一些非常基本的东西,但我似乎无法弄清楚那是什么。任何人都可以帮忙吗? 最佳答案
最后自己找到了解决办法。这是使用 fcntl.flock()
而不是 fcntl.lockf()
,具有完全相同的参数。不知道为什么会有所不同。
关于python - 文件锁定未按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5369870/