Возникли проблемы с функцией flock () - PullRequest
1 голос
/ 12 октября 2010

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

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

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

1 Ответ

2 голосов
/ 13 октября 2010

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

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

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

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

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

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

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

...