На своем сервере я запустил 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 Викиучебник