Обрабатывать запросы на колбу одновременно с threaded = True
Что именно делает передача threaded = True
в app.run()
?
Мои приложения обрабатываются пользователем, и для этого требуется немного времени. За это время приложение не может обрабатывать другие запросы. Я тестировал свое приложение с помощью threaded=True
, и он позволяет мне обрабатывать несколько запросов одновременно.
Ответы
Ответ 1
Начиная с Flask 1.0, сервер WSGI, входящий в состав Flask, по умолчанию работает в многопоточном режиме.
До версии 1.0, или если вы отключили многопоточность, сервер работает в однопоточном режиме и может обрабатывать только один запрос за раз. Любые параллельные запросы должны будут ждать, пока они не будут обработаны, что может привести к проблемам, если вы попытаетесь связаться с вашим собственным сервером из запроса.
С threaded=True
запросы обрабатываются в новом потоке. Сколько потоков ваш сервер может обрабатывать одновременно, полностью зависит от вашей ОС и того, какие ограничения он устанавливает на количество потоков на процесс. Реализация использует класс SocketServer.ThreadingMixIn
, который не устанавливает ограничений на количество потоков, которые он может раскрутить.
Обратите внимание, что сервер Flask предназначен только для разработки. Это не готовый к работе сервер. Не надейтесь на это, чтобы запустить свой сайт в более широкой сети. Вместо этого используйте правильный сервер WSGI (например, gunicorn или uWSGI).
Ответ 2
Сколько запросов мое приложение сможет обрабатывать одновременно с этим утверждением?
Это зависит от вашего приложения. Каждый новый запрос будет иметь поток запущен - он зависит от того, сколько потоков ваша машина может обрабатывать. Я не вижу возможности ограничить количество потоков (например, uwsgi-предложения в производственном развертывании).
Каковы недостатки использования этого? Если я не ожидаю более нескольких запросов одновременно, могу ли я продолжать использовать это?
Переключение с одного потока на многопоточное может привести к ошибкам concurrency... если вы используете это, будьте осторожны с тем, как вы обрабатываете глобальные объекты (см. объект g в документации!) и состояние.