Как обработать несколько HTTP-запросов с Flask - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть вопрос относительно Flask, Официантка и параллельная обработка HTTP-запросов.

Я прочитал, что только Flask может обрабатывать только один HTTP-запрос за раз.

В таблице ниже я разместил все возможные конфигурации и хотел бы получить ваши отзывы о количестве HTTP-запросов, которые я могу обрабатывать параллельно.

|                        |Only Flask| Flask and Waitress|
|-------------------  -- |----------|-------------------|
|1 CPU & 1 core          | 1 request| 1 request         |
|1 CPU & 4 core          | 1 request| 4 request         |
|2 CPU & 1 core each CPU | 1 request| 2 request         |
|2 CPU & 4 core each CPU | 1request | 8 requests        |  

Я задаю эти вопросы потому что коллега сказал мне, что мы можем обработать несколько тысяч HTTP-запросов на сервере Apach только с 1 ЦП и 1 ядром !!

Итак, как мне обрабатывать максимальное количество HTTP-запросов параллельно?

1 Ответ

1 голос
/ 22 февраля 2020

Позвольте мне устранить путаницу для вас.

Когда вы используете Flask при локальной разработке, вы используете встроенный однопоточный сервер. это означает, что он будет обрабатывать только один запрос за раз. Это одна из причин, почему вы не должны просто иметь FLASK_ENV=production и работать в производственной среде. Встроенный сервер не способен работать в таких средах. После того, как вы измените FLASK_ENV на рабочий и запустите, вы увидите предупреждение в терминале.

Теперь перейдем к тому, как запустить Flask в производственной среде, процессорах, ядрах, потоках и других. stuff

Чтобы запустить Flask в производственной среде, вам необходим соответствующий сервер приложений, который может запускать ваше приложение Flask. Здесь используется Gunicorn , который совместим с Flask и одним из самых востребованных способов бега Flask.

В Gunicorn у вас есть разные способы настроить оптимальный способ его запуска на основе спецификаций ваших серверов. Вы можете достичь этого следующими способами:

  1. Рабочий класс - Тип используемого рабочего
  2. Количество рабочих
  3. Количество потоков

Способ расчета максимального количества одновременных запросов выглядит следующим образом: Принимая 4-ядерный сервер за

Согласно документации gunicorn , предлагается оптимальный number of workers как (2 * num_of_cores) + 1, который в этом случае становится (2 * 4) +1 = 9

Теперь оптимальная конфигурация для числа потоков s равна 2 to 4 x $(num_of_cores), что в данном случае 4 * 9 = 36

Итак, теперь у вас есть 9 рабочих с 36 потоками каждый. Каждый поток может обрабатывать один запрос за раз, так что вы можете иметь 9 * 36 = 324 одновременных подключений

Аналогично, вы можете иметь расчет для Waitress. Я предпочитаю использовать Gunicorn, поэтому вам нужно проверить документы официантка для конфигурации.

Теперь перейдем к веб-серверам

До сих пор вы настраивали сервер приложений для запуска Flask. Это работает, но вы не должны напрямую выставлять сервер приложений на inte rnet. Вместо этого всегда предлагается развернуть Flask за обратным прокси-сервером, например Nginx. Nginx действует как полноценный веб-сервер, способный обрабатывать реальные рабочие нагрузки.

Таким образом, вы можете использовать комбинацию из списка ниже в соответствии с вашими требованиями,

Flask + Сервер приложений + веб-сервер , где Сервер приложений - это один из Gunicorn, uWSGI, Gevent, Twisted Web, Waitress, et c и веб-сервер из одного из Nginx, Apache, Traefik, Caddy, et c

...