Сколько одновременных запросов получает один процесс Flask?

Я создаю приложение с колбой, но я мало знаю о WSGI, и это HTTP-база, Werkzeug. Когда я начинаю обслуживать приложение Flask с gunicorn и 4 рабочими процессами, означает ли это, что я могу обрабатывать 4 параллельных запроса?

Я имею в виду параллельные запросы, а не запросы в секунду или что-либо еще.

спасибо!

4 ответов


при запуске сервера разработки вы получите работающий app.run(), вы получаете один синхронный процесс, Что означает, что одновременно обрабатывается не более 1 запроса.

приклеивая Gunicorn перед ним в конфигурации по умолчанию и просто увеличивая количество --workers, что вы получаете, по существу, ряд процессов (управляемых Gunicorn), каждый из которых ведет себя как app.run() сервер разработки. 4 рабочих == 4 одновременных запроса. Это потому, что Gunicorn использует его включено sync рабочий тип по умолчанию.

важно отметить, что Gunicorn также включает асинхронных работников, а именно eventlet и gevent (а также tornado, но это лучше всего использовать с системой "Торнадо", кажется). Указав один из этих асинхронных работников с помощью --worker-class флаг, что вы получаете, это Gunicorn управление рядом асинхронных процессов,каждому из которых управление собственным параллелизма. Эти процессы не используют потоки, а вместо них используются сопрограммы. В принципе, в каждом процессе одновременно может происходить только 1 вещь (1 поток), но объекты могут быть "приостановлены", когда они ждут завершения внешних процессов (подумайте о запросах базы данных или ожидании сетевого ввода-вывода).

это означает, что если вы используете одного из асинхронных работников Gunicorn, каждый работник может обрабатывать гораздо больше, чем один запрос за раз. Сколько работников лучше всего, зависит от характера вашего приложения, его среды, аппаратного обеспечения и т. д. Более подробная информация может на Gunicorn это страница и заметки о том, как работает gevent на своей странице в интро.


колба будет обрабатывать один запрос на поток одновременно. Если у вас есть 2 процесса с 4 потоками каждый, это 8 одновременных запросов.

колба не порождает и не управляет потоками или процессами. Это ответственность шлюза WSGI (например. gunicorn).


нет-вы определенно можете справиться больше, чем это.

важно помнить, что в глубине души, предполагая, что вы работаете с одной базовой машиной, CPU действительно запускает только одну инструкцию* за раз.

а именно, CPU может выполнять только очень ограниченный набор инструкций, и он не может выполнять более одной инструкции за такт (многие инструкции даже занимают более 1 тика).

таким образом, большинство параллелизма мы говорим о в информатике является программным параллелизмом. Другими словами, существуют уровни реализации программного обеспечения, которые абстрагируют от нас процессор нижнего уровня и заставляют нас думать, что мы одновременно запускаем код.

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

Другим примером являются потоки, которые являются единицами кода внутри процессов, которые также допускают параллелизм.

причина, по которой ваши 4 рабочих процесса смогут обрабатывать более 4 запросов, заключается в том, что они будут запускать потоки для обработки все большего количества запросов.

фактический предел запроса зависит от выбранного сервера HTTP, ввода-вывода, ОС,оборудования, сетевого подключения и т. д.

удачи!

*инструкции - это самые основные команды, которые может запускать процессор. примеры-добавить два числа, перейти от одной инструкции к другой


в настоящее время гораздо проще решение, чем те, которые уже предоставлены. При запуске приложения вы просто должны пройти вдоль до app.run() звонок, типа:

app.run(host="your.host", port=4321, threaded=True)

другой вариант в соответствии с тем, что мы можем видеть в werkzeug docs, используется procesess параметр, который получает число > 1, указывающее максимальное количество параллельных процессов для обработки:

  • резьбовые должны процесс обрабатывает каждый запрос в отдельном потоке?
  • processes - если больше 1, обработайте каждый запрос в новом процессе до этого максимального количества параллельных процессов.

что-то типа:

app.run(host="your.host", port=4321, processes=3) #up to 3 processes

подробнее о run() метод здесь и блоге это привело меня к поиску решения и ссылок на api.