Замок файла не работает, как и ожидалось
Вопрос
у меня есть 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()
, с точно такими же параметрами. Не уверен, почему это изменило ситуацию.
Другие советы
Вы открываете файл блокировки, используя r+
который стирает предыдущий файл и создает новый. Каждый поток блокирует другой файл.
Использовать w
или же r+a
Наряду с использованием Flock, я должен был также открыть файл так:
fd = os.open(lockfile, os.O_CREAT | os.O_TRUNC | os.O_WRONLY)
Это не работает иначе.