我有一个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
线程同时运行,没有异常抛出。我确定我在这里遗漏了一些非常基本的东西,但我似乎无法弄清楚那是什么。有人可以帮忙吗?
答案 0 :(得分:3)
最终我自己找到了解决方案。这是使用fcntl.flock()
而不是fcntl.lockf()
,具有完全相同的参数。不确定为什么会有所作为。
答案 1 :(得分:2)
您正在使用r+
打开锁定文件,该文件正在删除上一个文件并创建一个新文件。每个线程都锁定一个不同的文件。
使用w
或r+a
答案 2 :(得分:0)
除了使用flock之外,我还必须像这样打开文件:
fd = os.open(lockfile, os.O_CREAT | os.O_TRUNC | os.O_WRONLY)
其他方面无效。