Python: заблокировать файл

У меня есть приложение Python, работающее в Linux. Он называется каждую минуту от cron. Он проверяет каталог для файлов и обнаруживает, что он обрабатывает его – это может занять несколько минут. Я не хочу, чтобы следующее задание cron собирало файл, обрабатываемый в настоящий момент, поэтому я блокирую его, используя код, ниже которого вызывается блокнот. Проблема в том, что это не работает. Следующему заданию cron удается получить дескриптор файла, возвращаемый для файла, все готовые к обработке.

def open_and_lock(full_filename): file_handle = open(full_filename, 'r') try: portalocker.lock(file_handle, portalocker.LOCK_EX | portalocker.LOCK_NB) return file_handle except IOError: sys.exit(-1) 

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

ОБНОВИТЬ

Благодаря @Winston Ewert я проверил код и обнаружил, что дескриптор файла закрыт до завершения обработки. Кажется, теперь он работает, за исключением вторых блоков процесса на portalocker.lock, а не бросает исключение.

5 Solutions collect form web for “Python: заблокировать файл”

Вы используете флаг LOCK_NB, что означает, что вызов не блокируется и будет немедленно возвращаться к ошибке. Это, вероятно, происходит во втором процессе. Причина, по которой он все еще в состоянии прочитать файл, заключается в том, что порталокер в конечном счете использует блокировки flock (2) и, как упоминалось на странице man flock (2) :

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

Чтобы исправить это, вы можете напрямую использовать функцию fcntl.flock (portalocker – это всего лишь тонкая оболочка вокруг Linux) и проверить возвращаемое значение, чтобы убедиться, что блокировка выполнена успешно.

как вручную создать старомодный .lock рядом с файлом, который вы хотите заблокировать?

просто проверьте, есть ли там; если нет, создайте его, если оно есть, выйдите преждевременно. после окончания, удалите его.

Не используйте cron для этого. Linux имеет inotify , который может уведомлять приложения, когда происходит событие файловой системы. Существует связка Python для inotify называемая pyinotify .

Таким образом, вам не нужно блокировать файл – вам просто нужно реагировать на события IN_CLOSE_WRITE (т.е. когда файл, открытый для записи, был закрыт). (Вам также не потребуется каждый раз запускать новый процесс.)

Альтернативой использованию pyinotify является incron, который позволяет вам писать incrontab (очень в том же стиле, что и crontab), чтобы взаимодействовать с системой inotify.

После того, как вы возились со многими схемами, это работает в моем случае. У меня есть сценарий, который может выполняться несколько раз одновременно. Мне нужны эти экземпляры, чтобы ждать их очереди, чтобы читать / писать в некоторые файлы. Файл блокировки не нужно удалять, поэтому вы избегаете блокировки всего доступа, если один скрипт выходит из строя, прежде чем удалять его.

 import fcntl def acquireLock(): ''' acquire exclusive lock file access ''' locked_file_descriptor = open('lockfile.LOCK', 'w+') fcntl.lockf(locked_file_descriptor, fcntl.LOCK_EX) return locked_file_descriptor def releaseLock(locked_file_descriptor): ''' release exclusive lock file access ''' locked_file_descriptor.close() lock_fd = acquireLock() # ... do stuff with exclusive access to your file(s) releaseLock(lock_fd) 

Я думаю, что fcntl.lockf – это то, что вы ищете.

  • Основной триггер: проблема math.atan ()
  • Рекурсивно перемещение дерева наследования Python во время выполнения
  • Определение функции __getattr__ и __getitem__ в функции не влияет
  • Как подключить / слить два генератора с помощью python
  • Как печатать из Flask @ app.route в консоль python
  • Является ли Python строго типизированным?
  • Какова методика представления снова формы, содержащей ошибку?
  • построить производственную площадку с бутылкой
  • Python - лучший язык программирования в мире.