Просто начинаю играть с Flask на локальном сервере, и я замечаю, что время запроса / ответа намного медленнее, чем, как мне кажется, должно быть.
Простой сервер, подобный следующему, отвечает примерно за 5 секунд.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
Любые идеи? Или это просто локальный сервер?
Ответы:
Хорошо, я разобрался. Похоже, это проблема с Werkzeug и ОС, поддерживающими ipv6.
С сайта Werkzeug http://werkzeug.pocoo.org/docs/serving/ :
Итак, исправление - отключить ipv6 с локального хоста, закомментировав следующую строку из моего файла hosts:
::1 localhost
Как только я это сделаю, проблемы с задержкой исчезнут.
Я очень копаю Flask и рад, что это не проблема с фреймворком. Я знал, что этого не может быть.
источник
Добавьте «threadaded = True» в качестве аргумента в app.run (), как предлагается здесь: http://arusahni.net/blog/2013/10/flask-multithreading.html
Например:
app.run(host="0.0.0.0", port=8080, threaded=True)
Решение с отключением ipv6 у меня не сработало, но это сработало.
источник
--threaded
на моеmanage.py
использованиеFlask-Script
тоже сработал.flask run --with-threads
которая решила мою проблему.Решение от @ sajid-siddiqi технически правильное, но имейте в виду, что встроенный сервер WSGI в Werkzeug (который упакован во Flask и для чего он используется
app.run()
) является только однопоточным.Установите сервер WSGI, чтобы иметь возможность обрабатывать многопоточное поведение. Я провел кучу исследований производительности различных серверов WSGI . Ваши потребности могут различаться, но если вы используете только Flask , я бы порекомендовал один из следующих веб-серверов.
Обновление (2020-07-25): похоже, gevent начал поддерживать python3 5 лет назад, вскоре после того, как я прокомментировал, что это не так, поэтому вы можете использовать gevent сейчас.
Gevent
Вы можете установить gevent через pip с помощью команды
pip install gevent
или pip3 с помощью командыpip3 install gevent
. Инструкции о том, как соответствующим образом изменить ваш код, находятся здесь: https://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#geventMeinheld
gevent лучше, но из всех тестов, которые я просмотрел, которые включают тестирование в реальном мире, meinheld кажется самым простым и упрощенным сервером WSGI . (Вы также можете взглянуть на uWSGI, если не возражаете против дополнительных настроек.)
Вы также можете установить meinheld через pip3 с помощью команды
pip3 install meinheld
. Оттуда посмотрите на образец, предоставленный в источнике meinheld для интеграции Flask : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py* ПРИМЕЧАНИЕ. Из-за того, что я использовал PyCharm , строка
from meinheld import server
выделяется как ошибка, но сервер будет работать, поэтому вы можете игнорировать ошибку.источник
Вместо звонка
http://localhost:port/endpoint
звонитеhttp://127.0.0.1:port/endpoint
. Это устранило для меня начальную задержку в 500 мс.источник
Моя проблема была решена с помощью «threadaded = True», но я хочу дать некоторую предысторию, чтобы отличить мою проблему от других, для которых это может не сработать.
Я предполагаю, что Chrome пытался сохранить сеанс открытым, а Flask блокировал последующие запросы. Как только соединение из Chrome было остановлено или сброшено, все остальное обработалось.
В моем случае это исправила многопоточность. Конечно, сейчас я просматриваю некоторые ссылки, которые предоставили другие, чтобы убедиться, что это не вызовет никаких других проблем.
источник
threaded=True
работает для меня, но, наконец, я понял, что проблема связана с foxyproxy в firefox. Поскольку, когда приложение flask работает на локальном хосте, медленный ответ происходит, еслимедленный ответ не произойдет, если
foxyproxy отключен в Firefox
заходить на сайт через другие браузеры
Единственное решение, которое я нашел, - это отключить foxyproxy, попытаться добавить localhost в черный список прокси и настроить параметры, но ни один из них не работал.
источник
Я использовал ответ Михеко, чтобы решить свою проблему.
::1 localhost
был уже закомментирован в моем файле hosts, и настройкаThreaded=true
у меня не сработала. Каждый запрос REST обрабатывался не мгновенно, а занимал 1 секунду.Я использую python 3.6, и у меня есть flask, чтобы быстро реагировать на запросы REST, заставив flask использовать gevent в качестве своего WSGI.
Чтобы использовать gevent, установите его с помощью
pip install gevent
Впоследствии я использовал https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41 чтобы настроить колбу на использование gevent.
Если ссылка не работает, вот важные части скрипта:
from flask import Flask, Response from gevent.pywsgi import WSGIServer from gevent import monkey # need to patch sockets to make requests async # you may also need to call this before importing other packages that setup ssl monkey.patch_all() app = Flask(__name__) # define some REST endpoints... def main(): # use gevent WSGI server instead of the Flask # instead of 5000, you can define whatever port you want. http = WSGIServer(('', 5000), app.wsgi_app) # Serve your application http.serve_forever() if __name__ == '__main__': main()
источник
Я получил эту ошибку при работе на других хостах, кроме
localhost
, поэтому для некоторых различные проблемы могут проявлять одни и те же симптомы.Я переключил большинство вещей, которые я использовал, на Tornado, и, как ни странно, это помогло. У меня было несколько медленных загрузок страниц, но в целом все кажется более отзывчивым. Кроме того, очень анекдотично, но я, кажется, заметил, что только Flask со временем замедляется, а Flask + Tornado - меньше. Я представляю себе использование Apache и
mod_wsgi
сделаю это еще лучше, но Tornado действительно прост в настройке (см. Http://flask.pocoo.org/docs/deploying/others/ ).(Также связанный с этим вопрос: приложение Flask иногда зависает )
источник
У меня здесь было другое решение. Я просто удалил все
.pyc
из каталога сервера и снова запустил. Кстати, localhost уже был закомментирован в моем файле hosts (Windows 8).Сервер все время зависал и теперь снова работает нормально.
источник