Вопрос

У меня есть вопрос о том, как 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 в «не-уникс-системе или не локальной файловой системе».

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