Можно ли обслуживать несколько клиентов, используя только флажок app.run() как автономный?

Я знаю, что могу связать Flask с Apache или другими веб-серверами. Но я думал о запуске Flask как автономного сервера, обслуживающего несколько клиентов одновременно.

Возможно ли это? Должен ли я обрабатывать нереста нескольких потоков и управлять ими?

Ответ 1

flask.Flask.run принимает дополнительные аргументы ключевого слова (**options), которые он передает werkzeug.serving.run_simple - два из этих аргументов - threaded (логическое значение) и processes (которые можно установить на число больше единицы, чтобы werkzeug порождал более одного процесса для обработки запросов).

threaded по умолчанию равно True начиная с Flask 1.0, поэтому для последних версий Flask сервер разработки по умолчанию сможет одновременно обслуживать несколько клиентов. Для более старых версий Flask вы можете явно передать threaded=True, чтобы включить это поведение.

Например, вы можете сделать

if __name__ == '__main__':
    app.run(threaded=True)

для обработки нескольких клиентов с использованием потоков способом, совместимым со старыми версиями Flask, или

if __name__ == '__main__':
    app.run(threaded=False, processes=3)

чтобы сказать Werkzeug, чтобы он порождал три процесса для обработки входящих запросов, или просто

if __name__ == '__main__':
    app.run()

для обработки нескольких клиентов с использованием потоков, если вы знаете, что будете использовать Flask 1.0 или более позднюю версию.

При этом Werkzeug serving.run_simple упаковывает стандартный пакет wsgiref - и этот пакет содержит эталонную реализацию WSGI, а не готовый к работе веб-сервер. Если вы собираетесь использовать Flask в работе (при условии, что "production" - это не внутреннее приложение с низким трафиком и не более чем 10 одновременно работающих пользователей), убедитесь, что оно установлено на реальном веб-сервере (см. раздел документации Flask, озаглавленный Параметры развертывания для некоторых предлагаемых методов).

Ответ 2

Использование простого app.run() изнутри Flask создает единый синхронный сервер в одном потоке, который может обслуживать только одного клиента за раз. Он предназначен для использования в контролируемых средах с низким спросом (т.е. Разработки, отладки) именно по этой причине.

Порождения нитей и управление ими сами, вероятно, тоже не помогут вам получить из-за Python GIL.

Тем не менее, у вас все еще есть хорошие варианты. Gunicorn - это прочный, простой в использовании сервер WSGI, который позволит вам создавать множество сотрудников (отдельные процессы, поэтому никаких проблем с GIL) и даже поставляется с асинхронные рабочие, что ускорит ваше приложение (и сделает его более безопасным) с практически никакой работой с вашей стороны (особенно с Flask).

Тем не менее, даже Гуникорн, вероятно, не должен публично публиковаться. В производстве он должен использоваться за более надежным HTTP-сервером; nginx имеет тенденцию хорошо сочетаться с Gunicorn и Flask.