Блокировка файлов в Python с помощью fcntl

Я пытаюсь определить функции для облегчения блокировки файлов с помощью модуля fcntl. Когда я запускаю вручную

fcntl.lockf(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)

в двух отдельных экземплярах Python я получаю ожидаемое исключение

BlockingIOError: [Errno 11] Resource temporarily unavailable

но когда я определяю функции для автоматизации этого в mylock.py:

import fcntl

def lock(filepath):
    lock_file = open(filepath, "a")
    try:
        fcntl.lockf(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
    except OSError or BlockingIOError:
        return False
    return True

def unlock(filepath):
    lock_file = open(filepath, "a")
    try:
        fcntl.lockf(lock_file, fcntl.LOCK_UN)
    except OSError or BlockingIOError:
        return False
    return True

а затем импортируйте это в два отдельных экземпляра python и выполните

mylock.lock("test.txt")

который неожиданно возвращает True в обоих случаях. Является ли моя обработка ошибок неприемлемой? Я также пробовал except IOError:, except Exception: и except: - я не понимаю, почему BlockingIOError, возникающий при изолированном запуске команд fcntl, не вызывает выполнение логики except.


person Gavin Kirby    schedule 01.03.2018    source источник


Ответы (1)


Таким образом, проблема, по-видимому, заключалась в том, что файл собирался сборщиком мусора, поскольку дескриптор lock_file не использовался после функции. Если оператор return изменить на return lock_file, то достигается желаемое поведение.

person Gavin Kirby    schedule 01.03.2018