Ответ 1
Документация по перезагрузке кода - это лучший вариант для ответа. mod_wsgi
Есть ли способ, чтобы mod_wsgi перезагружал все модули (возможно, в конкретном каталоге) при каждой загрузке?
Во время работы над кодом очень раздражает перезапуск apache при каждом изменении. Единственный вариант, который я нашел до сих пор, - это поставить modname = reload(modname)
ниже каждого импорта.. но это также очень раздражает, так как это означает, что мне придется пройти и удалить их все позже.
Документация по перезагрузке кода - это лучший вариант для ответа. mod_wsgi
Ссылка:
http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode
следует подчеркнуть. Также следует подчеркнуть, что в UNIX-системах необходимо использовать демон-режим mod_wsgi, и вы должны реализовать монитор кода, описанный в документации. Весь процесс перезагрузки процесса не будет работать для встроенного режима mod_wsgi в системах UNIX. Несмотря на то, что в системах Windows единственным вариантом является встроенный режим, возможно, с помощью нескольких обманщиков сделать то же самое, инициировав внутренний перезапуск Apache из кода мониторинга script. Это также описано в документации.
Следующее решение предназначено только для пользователей Linux и было протестировано для работы в Ubuntu Server 12.04.1
Чтобы запустить WSGI в режиме демона, вам нужно указать директивы WSGIProcessGroup
и WSGIDaemonProcess
в конфигурационном файле Apache, например
WSGIProcessGroup my_wsgi_process
WSGIDaemonProcess my_wsgi_process threads=15
Более подробная информация доступна в http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives
Добавленный бонус является дополнительной стабильностью, если вы используете несколько сайтов WSGI под одним и тем же сервером, потенциально с помощью директив VirtualHost. Без использования процессов демона я обнаружил, что два сайта Django конфликтуют друг с другом и, в свою очередь, включают 500 внутренних ошибок сервера.
На этом этапе ваш сервер на самом деле уже отслеживает ваш сайт WSGI для изменений, хотя он отслеживает только указанный вами файл с помощью WSGIScriptAlias
, например
WSGIScriptAlias / /var/www/my_django_site/my_django_site/wsgi.py
Это означает, что вы можете заставить процесс демон WSGI перезагрузиться, изменив WSGI script. Конечно, вам не нужно менять его содержимое, но, скорее,
$ touch /var/www/my_django_site/my_django_site/wsgi.py
сделал бы трюк.
Используя вышеописанный метод, вы можете автоматически перезагрузить сайт WSGI в производственной среде без перезагрузки/перезагрузки всего сервера Apache или изменения WSGI script для мониторинга производительности, небезопасного кода.
Это особенно полезно при автоматическом развертывании сценариев и не нужно перезапускать сервер Apache при развертывании.
Во время разработки вы можете использовать наблюдателя изменений файловой системы, чтобы вызывать touch wsgi.py
каждый раз, когда изменяется модуль под вашим сайтом, например pywatch
Я знаю, что это старый поток, но это может помочь кому-то. Чтобы убить ваш процесс, когда записывается любой файл в определенном каталоге, вы можете использовать что-то вроде этого:
import os, sys, time, signal, threading, atexit
import inotify.adapters
def _monitor(path):
i = inotify.adapters.InotifyTree(path)
print "monitoring", path
while 1:
for event in i.event_gen():
if event is not None:
(header, type_names, watch_path, filename) = event
if 'IN_CLOSE_WRITE' in type_names:
prefix = 'monitor (pid=%d):' % os.getpid()
print "%s %s/%s changed," % (prefix, path, filename), 'restarting!'
os.kill(os.getpid(), signal.SIGKILL)
def start(path):
t = threading.Thread(target = _monitor, args = (path,))
t.setDaemon(True)
t.start()
print 'Started change monitor. (pid=%d)' % os.getpid()
В своем запуске сервера назовите его так:
import monitor
monitor.start(<directory which contains your wsgi files>)
если ваш основной файл сервера находится в каталоге, который содержит все ваши файлы, вы можете пойти так:
monitor.start(os.path.dirname(__file__))
Добавление других папок остается в виде упражнения...
Вам понадобится 'pip install inotify'
Это было вырезано из кода здесь: https://code.google.com/archive/p/modwsgi/wikis/ReloadingSourceCode.wiki#Restarting_Daemon_Processes
Это ответ на мой дублирующий вопрос: Модули перезагрузки WSGI