@Deadkenny

Сколько инстанстов Flask приложения запускает Gunicorn?

На своем сервере я запустил Nginx, который отдаёт запросы в Gunicorn, который отдает их дальше во Flask. Gunicorn запущен в несколько процессов.
И я не совсем понимаю принцип работы Gunicorn. Он запускает один инстанс моего Flask приложения или же он запускает по инстансу на каждый свой процесс? Или может быть Flask как-то хитро запускается и создает по новому потоку на каждый из процессов, запустивших его?
Я создал блокирующий запрос в обработке которого 20 секундное ожидание и затем возврат ответа. И приложение при 2х работающих процессах Gunicorn позволило сделать 8 запросов, а 9 запрос был поставлен в очередь.
В документации Flask написано следующее:
However Flask is just not designed for large applications or asynchronous servers. Flask wants to make it quick and easy to write a traditional web application.

Что поясняет что приложение Flask само по себе не асинхронное.

Ответ:
В конце концов я пришёл к выводу что Gunicorn запускает один экземпляр Flask приложения.
Запросы от NGINX попадают в Gunicorn, а он в свою очередь определяет передавать их в приложение сейчас или позже. Запросы от Gunicorn поступают в объект wsgi_app Flask`а. На каждый из запросов приложение Flask выделяет поток из пула потоков со своим контекстом, а после запроса этот контекст убивает. Таким образом получается что каждый worker Gunicorn обрабатывается в одном экземпляре приложения асинхронно.

Standalone WSGI Containers
Middlewares Werkzeug
Flask Викиучебник
  • Вопрос задан
  • 1276 просмотров
Решения вопроса 1
@Deadkenny Автор вопроса
В конце концов я пришёл к выводу что Gunicorn запускает один экземпляр Flask приложения.
Запросы от NGINX попадают в Gunicorn, а он в свою очередь определяет передавать их в приложение сейчас или позже. Запросы от Gunicorn поступают в объект wsgi_app Flask`а. На каждый из запросов приложение Flask выделяет поток из пула потоков со своим контекстом, а после запроса этот контекст убивает. Таким образом получается что каждый worker Gunicorn обрабатывается в одном экземпляре приложения асинхронно.

Standalone WSGI Containers
Middlewares Werkzeug
Flask Викиучебник
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Roman_Kh
Количество процессов, запускаемых gunicorn'ом, определяется его параметром workers.

Однако с помощью "асинхронных" worker'ов (например, gevent) можно условно параллельно обрабатывать несколько запросов даже в одном процессе.
Тип worker'а задается с помощью параметра worker-class.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы