Блокировка файла не работает должным образом - PullRequest
4 голосов
/ 20 марта 2011

У меня есть 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 ]

3 голосов
/ 20 марта 2011

В конце концов нашел решение сам.Он должен был использовать fcntl.flock() вместо fcntl.lockf() с точно такими же параметрами.Не уверен, почему это имело значение.

2 голосов
/ 20 марта 2011

Вы открываете файл блокировки, используя r+, который стирает предыдущий файл и создает новый.Каждый поток блокирует отдельный файл.

Используйте w или r+a

0 голосов
/ 26 августа 2013

Наряду с использованием flock, мне также пришлось открыть файл так:

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

Это не работает по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...