Как запустить Apache с mod_wsgi и django только в одном процессе?
Я использую Apache с включенными django и mod_wsgi в 2 разных процессах.
Я прочитал, что второй процесс является слушателем при изменении для перезагрузки кода при изменении, но по какой-то причине ready()
функция моего AppConfig
класс выполняется дважды. Эта функция должна запускаться только один раз.
Я понял, что работает Django Runserver с --noreload
Флаг решит проблему в режиме разработки, но я не могу найти решение для этого в производственном режиме на моем веб-сервере apache.
У меня есть два вопроса:
Как я могу запустить только один процесс в производстве или, по крайней мере, заставить только один процесс запустить
ready()
функция?Есть ли способ сделать
ready()
функция запускается не в ленивом режиме? Под этим я подразумеваю выполнение только при запуске сервера, а не при первом запросе.
Для дальнейшего объяснения я испытываю следующий сценарий: ready()
Функция создает прослушиватель папок, такой как pyinotify
, Этот слушатель будет прослушивать папку на моем сервере и ставить задачу в очередь на любые изменения. Я вижу, что этот слушатель выполняется дважды при любых изменениях в одном файле в контролируемом каталоге. Это заставляет меня поверить, что оба процесса работают с моим слушателем.
2 ответа
Нет, второй процесс не является слушателем onchange - я не знаю, где вы это читали. Это происходит с сервером разработки, а не с mod_wsgi.
Вы не должны пытаться запретить Apache обслуживать несколько процессов. Если вы это сделаете, скорость вашего сайта будет значительно снижена: он сможет обслуживать только один запрос за раз, а другие будут поставлены в очередь до первого завершения. Это не хорошо для всего, кроме сайта игрушек.
Вместо этого вы должны исправить свой AppConfig. Вместо того, чтобы слепо порождать слушателя, вы должны проверить, был ли он уже создан, прежде чем начинать новый.
Вы не должны предотвращать порождение нескольких процессов, потому что это хорошо, особенно в производственной среде. Вам следует рассмотреть возможность использования какого-либо внешнего инструмента, отдельного от django, или добавить проверку, если прослушивание папок уже запущено (например, отслеживать постоянство файла PID и его содержимого).