При запуске сервера разработки - это то, что вы получаете, запустив app.run()
, вы получаете один синхронный процесс, что означает, что одновременно обрабатывается не более 1 запроса.
Поместив Gunicorn перед ним в его конфигурацию по умолчанию и просто увеличив количество --workers
, вы получите, по сути, количество процессов (управляемых Gunicorn), каждый из которых ведет себя как app.run()
сервер разработки. 4 рабочих == 4 одновременных запроса. Это потому, что Gunicorn sync
по умолчанию использует свой включенный рабочий тип.
Важно отметить, что Gunicorn также включает асинхронные рабочие процессы, а именно eventlet
и gevent
(а также tornado
, но, кажется, лучше всего использовать его с фреймворком Tornado). Указав один из этих асинхронных рабочих --worker-class
процессов с помощью флага, вы получите Gunicorn, управляющий несколькими асинхронными процессами, каждый из которых управляет собственным параллелизмом. Эти процессы не используют потоки, а вместо них сопрограммы. По сути, внутри каждого процесса одновременно может происходить только 1 событие (1 поток), но объекты могут быть «приостановлены», когда они ожидают завершения внешних процессов (например, запросы к базе данных или ожидание сетевого ввода-вывода).
Это означает, что если вы используете один из асинхронных воркеров Gunicorn, каждый воркер может обрабатывать гораздо больше, чем один запрос за раз. Какое количество воркеров лучше всего зависит от характера вашего приложения, его среды, оборудования, на котором оно работает, и т. Д. Более подробную информацию можно найти на странице дизайна Gunicorn, а заметки о том, как работает gevent, - на его вводной странице.
В настоящее время существует гораздо более простое решение, чем уже предоставленные. При запуске вашего приложения вам просто нужно передать
threaded=True
параметр вapp.run()
вызов, например:Другой вариант, который мы видим в документации werkzeug , - использовать
processes
параметр, который получает число> 1, указывающее максимальное количество одновременных процессов для обработки:Что-то вроде:
Дополнительная информация о
run()
методе здесь , а также сообщение в блоге, которое привело меня к поиску решения и ссылки на API.Примечание: в документации Flask о
run()
методах указано, что использование его в производственной среде не рекомендуется, потому что ( цитата ): «Хотя встроенный сервер Flask легкий и простой в использовании, он не подходит для производства, поскольку он плохо масштабируется. «.Тем не менее, они указывают на свою страницу параметров развертывания рекомендуемые способы сделать это при переходе на производство.
источник
Flask будет обрабатывать по одному запросу на поток одновременно. Если у вас есть 2 процесса с 4 потоками в каждом, это 8 одновременных запросов.
Flask не создает и не управляет потоками или процессами. Это ответственность шлюза WSGI (например, gunicorn).
источник
Нет, ты определенно справишься и с большим.
Важно помнить, что глубоко внутри, предполагая, что вы работаете на одноядерной машине, ЦП действительно выполняет только одну инструкцию * за раз.
А именно, ЦП может выполнять только очень ограниченный набор инструкций, и он не может выполнять более одной инструкции за один такт (многие инструкции даже занимают более одного такта).
Следовательно, параллелизм, о котором мы говорим в компьютерных науках, - это параллелизм программного обеспечения. Другими словами, существуют уровни программной реализации, которые абстрагируют от нас ЦП нижнего уровня и заставляют думать, что мы выполняем код одновременно.
Эти «вещи» могут быть процессами, то есть единицами кода, которые запускаются одновременно в том смысле, что каждый процесс думает, что он работает в своем собственном мире со своей собственной, не разделяемой памятью.
Другой пример - потоки, которые представляют собой блоки кода внутри процессов, которые также допускают параллелизм.
Причина, по которой ваши 4 рабочих процесса смогут обрабатывать более 4 запросов, заключается в том, что они будут запускать потоки для обработки все большего количества запросов.
Фактический лимит запросов зависит от выбранного HTTP-сервера, ввода-вывода, ОС, оборудования, сетевого подключения и т. Д.
Удачи!
* инструкции - это самые простые команды, которые может выполнять ЦП. примеры - сложить два числа, перейти от одной инструкции к другой
источник