Я пытаюсь определить функции для облегчения блокировки файлов с помощью модуля 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
.