Как настроить автозапуск с помощью Flask+uWSGI?
Я ищу что-то вроде режим автоматической загрузки uWSGI + django для склянки.
7 ответов
вы можете попробовать использовать supervisord в качестве менеджера для вашего приложения Uwsgi. Он также имеет функцию часов, которая автоматически перезагружает процесс, когда файл или папка были "затронуты"/изменены.
вы найдете хороший учебник здесь:Фляга+С Nginx+На Uwsgi+Supervisord
для среды разработки вы можете попробовать использовать -- python-параметр автоматической загрузки uwsgi. Глядя на исходный код, он может работать только в потоковом режиме (--enable-threads).
если вы настраиваете uwsgi
с аргументами команды, pass --py-autoreload=1
:
uwsgi --py-autoreload=1
если вы используете настройка uwsgi
и с помощью uwsgi --ini
добавьте следующий код :
py-autoreload = 1
функция автоматической перезагрузки колбы режима разработки фактически обеспечивается базовой библиотекой Werkzeug. Соответствующий код находится в werkzeug/serving.py
-- стоит взглянуть. Но в принципе, основное приложение порождает сервер WSGI как подпроцесс, который статистика каждый активный .py
файл один раз в секунду, ищет изменения. Если он видит какой-либо, подпроцесс завершается, и родительский процесс снова запускает его-фактически перезагружая чаги.
нет причин вы не могли бы реализовать подобную технику на уровне uWSGI. Если вы не хотите использовать цикл stat, вы можете попробовать использовать базовые команды просмотра файлов ОС. Видимо (по коду сверла по), pyinotify глючит, но, возможно,сторож работает? Попробуйте несколько вещей и посмотрите, что произойдет.
Edit:
в ответ на комментарий, Я думаю, что это будет довольно легко реализовать. Построение на примере, приведенном ваша ссылка вместе с кодом от werkzeug/serving.py
:
""" NOTE: _iter_module_files() and check_for_modifications() are both
copied from Werkzeug code. Include appropriate attribution if
actually used in a project. """
import uwsgi
from uwsgidecorators import timer
import sys
import os
def _iter_module_files():
for module in sys.modules.values():
filename = getattr(module, '__file__', None)
if filename:
old = None
while not os.path.isfile(filename):
old = filename
filename = os.path.dirname(filename)
if filename == old:
break
else:
if filename[-4:] in ('.pyc', '.pyo'):
filename = filename[:-1]
yield filename
@timer(3)
def check_for_modifications():
# Function-static variable... you could make this global, or whatever
mtimes = check_for_modifications.mtimes
for filename in _iter_module_files():
try:
mtime = os.stat(filename).st_mtime
except OSError:
continue
old_time = mtimes.get(filename)
if old_time is None:
mtimes[filename] = mtime
continue
elif mtime > old_time:
uwsgi.reload()
return
check_for_modifications.mtimes = {} # init static
это проверялось, но должно работать.
import gevent.wsgi
import werkzeug.serving
@werkzeug.serving.run_with_reloader
def runServer():
gevent.wsgi.WSGIServer(('', 5000), app).serve_forever()
(можно использовать произвольный сервер WSGI)
Я боюсь, что Flask действительно слишком голые кости, чтобы иметь такую реализацию, как это в комплекте по умолчанию.
динамическая перезагрузка кода в производстве, как правило, плохая вещь, но если вас беспокоит среда разработки, взгляните на этот сценарий оболочки bash http://aplawrence.com/Unixart/watchdir.html
просто измените интервал сна на то, что соответствует вашим потребностям, и замените команду echo тем, что вы используете для перезагрузки uwsgi. Я запустить мастер на uwsgi режим ООН и просто отправить команду на uwsgi команду killall.