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, см. ниже и наслаждайтесь:)

https://github.com/aldanor/SocketIO-Flask-Debug