gevent-socketio + фляга + Gunicorn
могу ли я использовать gevent-socketio с колбой, работающей под Gunicorn, и по-прежнему наслаждаться хорошей печатью исключений, отладчиком и возможностью перезагрузки, которую предлагает колба? Как будет выглядеть мой gunicorn worker и класс приложений WSGI?
3 ответов
у меня такая же проблема, поэтому я решил ее с помощью watchdog.
pip install watchdog
вместе с этой командой:
watchmedo shell-command --patterns="*.py*;;*.less;*.css;*.js;*.txt;*.html" --recursive --command='kill -HUP `cat /tmp/gunicorn.pid` && echo "Reloading code" >> /tmp/gunicorn.log' ~/projectfolder
это требует (ну, не совсем, но я указываю "перезагрузка кода" в тот же файл журнала, так что это приятно иметь), что вы демонизируете процесс gunicorn, который мне нравится:
gunicorn_config.py
workers = 2
worker_class = 'socketio.sgunicorn.GeventSocketIOWorker'
bind = '0.0.0.0:5000'
pidfile = '/tmp/gunicorn.pid'
debug = True
loglevel = 'debug'
errorlog = '/tmp/gunicorn.log'
daemon = True
запустить приложение:
gunicorn run:app -c gunicorn-config.py
посмотреть log:
tail -f /tmp/gunicorn.log
С этого момента все должно быть перезагружено с каждым изменением в вашем проекте. Это немного сложно, но поскольку gunicorn с рабочим (или встроенным socketio-сервером) не имеет никаких возможностей перезагрузки, я должен был сделать это так.
это другой подход по сравнению с решением декоратора в другом ответе, но мне нравится держать фактический код чистым от конкретных решений для разработки. Оба совершают одно и то же, так что, думаю, ты просто ... нужно выбрать решение, которое вам нравится. :)
О, в качестве дополнительного бонуса вы можете использовать производственный сервер в разработке, что означает, что обе среды соответствуют друг другу.
Я изучал эту тему в последнее время. Я не думаю, что вы можете легко использовать функцию автоматической загрузки с Flask + gevent-socket.io + Gunicorn. Gunicorn-это производственный сервер, который изначально не допускает таких функций.
тем не менее, я нашел хорошее решение для моего сервера разработки : user SocketIOServer с библиотекой и фрагментом колбы для автоматической загрузки. Вот сценарий запуска (runserver.py):
from myapp import app
from gevent import monkey
from socketio.server import SocketIOServer
import werkzeug.serving
# necessary for autoreload (at least)
monkey.patch_all()
PORT = 5000
@werkzeug.serving.run_with_reloader
def runServer():
print 'Listening on %s...' % PORT
ws = SocketIOServer(('0.0.0.0', PORT), app, resource="socket.io", policy_server=False)
ws.serve_forever()
runServer()
это решение вдохновлено : http://flask.pocoo.org/snippets/34/
Я сделал некоторые настройки для отладчика Werkzeug, поэтому теперь он работает с сокетом.пространства имен io, см. ниже и наслаждайтесь:)