Вопрос

у меня есть 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)

Это не работает иначе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top