Как обработать несколько HTTP-запросов с помощью Flask

У меня вопрос по Flask, Waitress и параллельной обработке 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-запросов с сервером Apache только с 1 ЦП и 1 ядром!!

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


person ZchGarinch    schedule 21.02.2020    source источник
comment
В предоставленной вами ссылке говорится, что встроенный сервер, поставляемый с Flask, не может обрабатывать запросы, а не сам Flask. Он дает список HTTP-серверов, которые можно использовать вместо него. Apache пользуется доверием, но можно использовать и другие.   -  person didiz    schedule 22.02.2020
comment
Вы правы, и именно поэтому я использовал официантку. Не могли бы вы подтвердить значения, которые я указал в таблице относительно количества запросов? Как мы можем обрабатывать тысячи запросов параллельно только с одним процессором и одним ядром   -  person ZchGarinch    schedule 22.02.2020
comment
Краткий ответ нет. В таблице, которую вы разместили, указано только одно, и я склонен этому верить. Тысяча одновременных запросов — это очень большой трафик.   -  person didiz    schedule 22.02.2020
comment
Итак, клянусь, могут ли ngix или apach обрабатывать такой трафик только с ядром oe? Почему рекомендуется использовать ngix для обслуживания приложения Flask?   -  person ZchGarinch    schedule 22.02.2020
comment
Nginx может легко обрабатывать запросы, но это не сервер приложений. Ваше приложение не имеет состояния и сколько времени требуется для выполнения одного запроса? Единственным способом было бы для вас, чтобы на самом деле измерить его. Вот один из таких экспериментов с 2400 запросами на одного воркера freecodecamp. .org/новости/   -  person didiz    schedule 22.02.2020
comment
Что вы имеете в виду за работника, пожалуйста? Нить рабочая? Если у меня одно ядро, значит, у меня только один поток? Мое приложение не имеет состояния, оно просто отправляет пользовательский ответ в зависимости от параметров запроса. Спасибо   -  person ZchGarinch    schedule 22.02.2020
comment
Не уверен, что вы имеете в виду, но вот еще один ответ, как nginx обрабатывает запросы без потоков: stackoverflow.com/questions/3436808/   -  person didiz    schedule 22.02.2020


Ответы (1)


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

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

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

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

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

  1. Рабочий класс — тип рабочего для использования
  2. Количество рабочих
  3. Количество потоков

Максимальное количество одновременных запросов можно рассчитать следующим образом:

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

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

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

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

Теперь переходим к веб-серверам

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

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

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

person Saiprasad Balasubramanian    schedule 22.02.2020