Я знаю, что могу связать Flask с Apache или другими веб-серверами. Но я думал о запуске Flask в качестве отдельного сервера, обслуживающего несколько клиентов одновременно.
Это возможно? Нужно ли обрабатывать несколько потоков и управлять ими?
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, озаглавленный Варианты развертывания для некоторых предлагаемых методов).
processes=100
и быть счастливым с этим? В моем случае мне нужны только статические файлы, а не методы HTTP Post. Мое требование - я хочу запустить все потоки Flask как часть моего родительского приложения, чтобы они могли совместно использовать переменные.Использование простого
app.run()
изнутри Flask создает один синхронный сервер в одном потоке, способный одновременно обслуживать только одного клиента. Именно по этой причине он предназначен для использования в контролируемых средах с низким спросом (т.е. разработка, отладка).Появление потоков и управление ими самостоятельно, вероятно, не слишком далеко продвинет вас из-за Python GIL .
Тем не менее, у вас все еще есть несколько хороших вариантов. Gunicorn - это надежный и простой в использовании сервер WSGI, который позволит вам порождать несколько рабочих (отдельные процессы, поэтому GIL не беспокоится) и даже поставляется с асинхронными рабочими , которые ускорят ваше приложение (и сделают его более безопасным) с минимальными затратами. не работать с вашей стороны (особенно с Flask).
Тем не менее, даже Gunicorn, вероятно, не должен быть публично разоблачен. В производстве его следует использовать за более надежным HTTP-сервером; nginx хорошо сочетается с Gunicorn и Flask.
источник
gunicorn app:app 127.0.0.1:8080
вместоpython app.py
. Nginx будет выступать в качестве общедоступной службы, предоставляющей доступ к вашему частному приложению, запускаемому Gunicorn (обратный прокси-сервер) , скрывая всевозможные подробности реализации HTTP более низкого уровня, возможно, напрямую обслуживая статические файлы и т. Д.