Запускаем gunicorn c gevent

09 Dec 2013

В мире Python сушествуют 2 наиболее известных сервера приложений: uWSGI и Gunicorn. Последный это форк рубишного Unicorn на pure python. uWSGI написан на C и казалось бы должен быть супербыстрым, но не всегда. Gunicorn может быть запущен в связке с Gevent, и в этом случае он будет сравним со скоростью работы uWSGI, а в некоторых случаях быстрее. Gevent это библиотека, позволяющая реализовывать “зеленые” потоки. Это такие очень легкие потоки, которые не управляются операционной системой. Проще говоря вы можете писать асинхронные приложения используя синхронный API. Можно провести аналогию с сопрограммами, которые можно остановить во время выполнения, а потом запустить снова (продолжить ее выполнение). Попробуем развернуть обычное Flask веб-приложение на связке nginx + gunicorn + gevent. Поставим Flask

pip install flask

В файле hello.py создадим минимальное Flask приложение:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

Создадим скрипт gevent_run.py для запуска Flask через gevent:

from gevent.wsgi import WSGIServer
from hello import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

Поставим gevent

sudo apt-get install libevent-dev
pip install gevent

Теперь запустим наше приложение через gevent

python gevent_run.py

Установим связку с gunicorn

pip install gunicorn

И запустим

python hello:app -k gevent

Запускать gunicorn вручную не всегда удобно, и тем более следить чтобы он был запущен в системе. Поэтому делать это будем через Supervisor

pip install supervisor

Пример конфиг файла для Supervisor можно взять тут

gunicorn \
-b :8091 -w 1 -k gevent \
--worker-connections=2000 \
--backlog=1000 -p gunicorn.pid \
--log-level=critical hello:app

comments powered by Disqus