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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Что-то вроде:

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

Больше информации о методе run() здесь и в блоге, который привел меня к поиску решения и ссылкам на API.

Ответ 4

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

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

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

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

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

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

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

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

Удачи!

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