2010-10-12 2 views
1

У меня вопрос о том, как работает flock(), особенно в python. У меня есть модуль, который открывает последовательное соединение (через os.open()). Мне нужно сделать эту нить безопасной. Это достаточно просто, чтобы обеспечить безопасность потока при работе в одном модуле с использованием threading.Lock(), но если модуль импортируется из разных мест, он ломается.Имея проблемы с функцией flock()

Я думал об использовании flock(), но у меня возникли проблемы с поиском достаточной информации о том, как точно работает стая. Я прочитал, что flock() открывает файл после закрытия файла. Но есть ли ситуация, когда файл будет открыт, если сбой python?

И что именно разрешено использовать заблокированный файл, если установлен LOCK_EX? Только модуль, который заблокировал файл? Любой модуль, который был импортирован из сценария, который был изначально запущен?

ответ

2

Когда процесс умирает, ОС должен очистить любые открытые файловые ресурсы (с некоторыми оговорками, я уверен). Это связано с тем, что консультативный замок освобождается, когда файл закрыт, операция, которая происходит как часть очистки ОС при выходе из процесса python.

Помните, flock(2) просто совещательный:

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

flock(2) осуществляет блокировку считывателей-писателей. Вы не можете ставить один и тот же файл дважды с LOCK_EX, но любое количество людей может стекаться с LOCK_SH одновременно (пока никто не имеет на нем LOCK_EX).

Запирающий механизм допускает два типа замков: общие замки и эксклюзивные замки. В любое время к файлу могут применяться несколько общих блокировок, но ни в коем случае не допускается одновременное одновременное использование нескольких исключительных или разделяемых и исключительных блокировок в файле.

flock работает на уровне ОС/процесса и не зависит от модулей python. Один модуль может запросить n замки, или n замки могут быть запрошены через m модулей. Однако только один процесс может содержать блокировку LOCK_EX в заданном файле в заданное время.

YMMV в системе «не UNIX» или нелокальной файловой системе.

+3

Другими словами, ANYONE может использовать файл, который был установлен даже с 'LOCK_EX'. Однако никто не сможет получить блокировку. –