Имея проблемы с функцией Flock ()
Вопрос
У меня есть вопрос о том, как flock()
Работы, особенно в Python. У меня есть модуль, который открывает серийное соединение (через os.open()
) Мне нужно сделать эту тему безопасной. Достаточно легко сделать его потоком безопасным при работе в одном и том же модуле, используя threading.Lock()
, но если модуль импортируется из разных мест, он ломается.
Я думал об использовании flock()
, но у меня проблемы с поиском достаточно информации о том, как именно работает Flock. Я читаю, что Flock () разблокирует файл после закрытия файла. Но есть ли ситуация, которая будет держать файл открытым, если Python вылетит?
И что именно разрешено использовать заблокированный файл, если LOCK_EX
установлен? Просто модуль, который заблокировал файл? Любой модуль, который был импортирован из сценария, который был изначально запускается?
Решение
Когда процесс умирает в ОС должен Очистите любые ресурсы открытых файлов (с некоторыми предостережением, я уверен). Это связано с тем, что консультативная блокировка выпускается при закрытии файла, операция, которая происходит как часть очистки ОС, когда python
процесс выходов.
Помните, стая (2) просто рекомендуется:
Консультативные замки позволяют Сотрудничество Процессы для выполнения согласованных операций в файлах, но [другие, плохо поведенные] процессы, все равно могут получить доступ к этим файлам без использования консультативных блокировков.
стая (2) реализует блокировку читателей. Вы не можете стекать один и тот же файл дважды с LOCK_EX
, но любое количество людей может стекаться с LOCK_SH
одновременно (пока ни у кого нет LOCK_EX
в теме).
Механизм блокировки позволяет два типа замков: общие замки и эксклюзивные замки. В любое время к файлу могут применяться несколько общих замков, но ни разу не являются несколькими эксклюзивными или общими, так и эксклюзивными, блокировки разрешены одновременно в файле.
Flock работает на уровне ОС/процесса и не зависит от модулей Python. Один модуль может запросить N. замки, или N. замки могут быть запрошены через м модули. Однако только один процесс может удерживать LOCK_EX
Заблокируйте заданный файл в данный момент времени.
YMMV в «не-уникс-системе или не локальной файловой системе».