文件锁未按预期工作

时间:2011-03-20 16:44:35

标签: python file-io filelock

我有一个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线程同时运行,没有异常抛出。我确定我在这里遗漏了一些非常基本的东西,但我似乎无法弄清楚那是什么。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

最终我自己找到了解决方案。这是使用fcntl.flock()而不是fcntl.lockf(),具有完全相同的参数。不确定为什么会有所作为。

答案 1 :(得分:2)

您正在使用r+打开锁定文件,该文件正在删除上一个文件并创建一个新文件。每个线程都锁定一个不同的文件。

使用wr+a

答案 2 :(得分:0)

除了使用flock之外,我还必须像这样打开文件:

fd = os.open(lockfile, os.O_CREAT | os.O_TRUNC | os.O_WRONLY)

其他方面无效。