Как настроить автозапуск с помощью Flask+uWSGI?

Я ищу что-то вроде режим автоматической загрузки uWSGI + django для склянки.

7 ответов


вы можете попробовать использовать supervisord в качестве менеджера для вашего приложения Uwsgi. Он также имеет функцию часов, которая автоматически перезагружает процесс, когда файл или папка были "затронуты"/изменены.

вы найдете хороший учебник здесь:Фляга+С Nginx+На Uwsgi+Supervisord


Я запускаю uwsgi версии 1.9.5 и опцию

uwsgi --py-autoreload 1

работает


для среды разработки вы можете попробовать использовать -- 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.