Форум сайта python.su
Уважаемые господа!
На веб-сервере работает скрипт, который пишет данные в лог. Подскажите, как в этом скрипте заблокировать лог так, чтобы другие копии скрипта не имели возможности записи в него, а ждали, пока данный скрипт не закончит работу с ним?
Офлайн
На веб-сервере работает скрипт, который пишет данные в лог. Подскажите, как в этом скрипте заблокировать лог так, чтобы другие копии скрипта не имели возможности записи в него, а ждали, пока данный скрипт не закончит работу с ним?Создать lock-file. Технически представляет собой пустой файл с именем, скажем, .log_file.lock. При запуске скрипта проверять наличие этого файла. Можно заглянуть в исходники portage (система управления пакетами Gentoo Linux), он как раз на питоне написан. Ну или в исходники любой другой системы управления пакетами.
Офлайн
.Serj.Хотелось бы что либо более высокоуровневое, понятное для человека, неписавшего скрипт, вроде функции flock в php. Хотя за неимением лучшего и этот способ прокатит, спасибо
Создать lock-file. Технически представляет собой пустой файл с именем, скажем, .log_file.lock. При запуске скрипта проверять наличие этого файла.
Отредактировано (Авг. 11, 2009 14:50:55)
Офлайн
.Serj.Дополнительный вопрос. Как при такой схеме реализовать ожидание разблокировки файла другими копиями скрипта?
Создать lock-file. Технически представляет собой пустой файл с именем, скажем, .log_file.lock. При запуске скрипта проверять наличие этого файла.
Офлайн
PaherЭто подойдет? http://dinsdale.python.org/doc/2.5/lib/module-fcntl.html
Уважаемые господа!
На веб-сервере работает скрипт, который пишет данные в лог. Подскажите, как в этом скрипте заблокировать лог так, чтобы другие копии скрипта не имели возможности записи в него, а ждали, пока данный скрипт не закончит работу с ним?
Отредактировано (Авг. 11, 2009 21:44:04)
Офлайн
То, что надо, за исключением малости - блокировка должна работать и на никсах, и в винде. Хотя фраза “On some systems, this function is emulated using fcntl().” внушает некоторую надежду :-). Спасибо!
К сожалению такого модуля в винде не нашел… Его там нет или нет в стандартной библиотеке?
Отредактировано (Авг. 11, 2009 16:53:51)
Офлайн
В вопросе вы не указывали, что вебсервер у вас на винде. Все, которые вокруг меня - на унихах :)
А в модуле так и написано: Availability: Unix, так что под винду его нет.
Это подойдет?: http://code.activestate.com/recipes/65203/
Офлайн
подошло бы, но я не нашел модулей win32con, win32file, pywintypes. Я новичок в python, возможно, что-то не так делаю. ДА и вариант с lock-файлами мне показался менее громоздким. Буду его реализовывать. Спасибо всем за помощь
Офлайн
Проблема с .lock файлами в том, что если ваш скрипт где-нибудь отвалится, а .lock файл останется, то остальные будут ждать вечно. В случае использования нормальных локов при завершении процесса система снимет лок сама.
Офлайн
PaherВ гугле вы тоже новичек :) ?
подошло бы, но я не нашел модулей win32con, win32file, pywintypes. Я новичок в python, возможно, что-то не так делаю.
Офлайн