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


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

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

спасибо!

4 80

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).

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

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

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

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

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

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

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

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

удачи!

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

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

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

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

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

что-то типа:

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

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