Какой безопасный способ сделать одноразовую инициализацию в Django / mod_wsgi? - PullRequest
2 голосов
/ 14 февраля 2011

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

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

Есть ли хорошее место для подключения к Django или WSGI для запуска такого кода инициализации ровно один раз, прежде чем будут разрешены какие-либо запросы? В качестве альтернативы, кто-нибудь знает, в каких ситуациях код инициализации модуля выполняется более одного раза (особенно в djangp / WSGI-land) или как можно где-нибудь спрятать флаг «я уже инициализирован»?

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

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

После завершения инициализации вы можете вызвать исключение MiddlewareNotinuse, из-за которого Django больше не выполняет это промежуточное ПО.

Помните, что из-за того, как работают apache и http, код не будет выполнен до того, как поступит первый запрос.

0 голосов
/ 14 февраля 2011

Мой код инициализации вызывается из файла Settings.py. Файл Settings.py будет выполнен только один раз и будет выполнен до обработки любого запроса.

См. http://code.djangoproject.com/wiki/SplitSettings о том, как разбить файл Settings.py.

0 голосов
/ 14 февраля 2011

Возможно, старый добрый файл блокировки является решением этой проблемы. Не очень элегантное решение, но оно избавляет вас от головной боли в многопоточной среде.

...