Медленные запросы на локальный сервер фляг
Просто начинайте играть с Flask на локальном сервере, и я замечаю, что время запроса/ответа медленнее, чем я считаю, что они должны быть.
Только простой сервер, такой как следующий, занимает около 5 секунд, чтобы ответить.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
Любые идеи? Или это как раз то, как локальный сервер?
Ответы
Ответ 1
Хорошо, я понял это. По-видимому, проблема связана с Werkzeug и os, которые поддерживают ipv6.
С сайта Werkzeug http://werkzeug.pocoo.org/docs/serving/:
В операционных системах, поддерживающих ipv6 и настроенных таким образом, как современные системы Linux, OS X 10.4 или выше, а также в Windows Vista, некоторые браузеры могут быть очень медленными при доступе к вашему локальному серверу. Причиной этого является то, что иногда "localhost" настроен на доступность как на ipv4, так и на ipv6 socktes, и некоторые браузеры будут пытаться получить доступ к первому ipv6, а затем ivp4.
Итак, исправление заключается в том, чтобы отключить ipv6 от localhost, комментируя следующую строку из моего файла hosts:
::1 localhost
Как только я это сделаю, проблемы с задержкой исчезнут.
Я действительно копаю Flask, и я рад, что это не проблема с каркасом. Я знал, что этого не может быть.
Ответ 2
Добавьте "threaded = True" в качестве аргумента app.run(), как предлагается здесь:
http://arusahni.net/blog/2013/10/flask-multithreading.html
Например: app.run(host="0.0.0.0", port=8080, threaded=True)
Решение ipv6-disabling для меня не сработало, но это произошло.
Ответ 3
Решение от @sajid-siddiqi является технически правильным, но имейте в виду, что встроенный WSGI-сервер в Werkzeug (который упакован во Flask и что он использует для app.run()
) является только однопоточным.
Установите сервер WSGI, чтобы иметь возможность обрабатывать многопоточное поведение. Я провел ряд исследований по различным характеристикам сервера WSGI. Ваши потребности могут отличаться, но если вы используете только Flask, я бы порекомендовал один из следующих веб-серверов.
Для Python 2.x: gevent
Вы можете установить gevent через pip с помощью команды pip install gevent
. Инструкции о том, как соответствующим образом изменить ваш код, можно найти здесь: http://flask.pocoo.org/docs/0.10/deploying/wsgi-standalone/#gevent
Для Python 3.x: meinheld
Gevent лучше, но он все еще не обновлен для использования python3 (обновления см. в этой ветке: https://github.com/gevent/gevent/issues/38). Из всех тестов, которые я рассмотрел, включая тестирование в реальных условиях, 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
выделяется как ошибка, но сервер будет работать, так что вы можете игнорировать ошибку.
Ответ 4
У меня не хватает репутации для комментариев, поэтому я добавлю это как "решение".
Моя проблема была решена с помощью "threaded = True", но я хочу дать некоторый фон, чтобы отличить мою проблему от других, для которых это может не сделать.
- Моя проблема возникла только при запуске Flask с python3. Перейдя на python2, у меня больше не было этой проблемы.
- Моя проблема проявилась только при доступе к api с Chrome, после чего Chrome отобразил ожидаемый экран, но все остальное зависало (завивка, ffx и т.д.), пока я не перезагрузил или не закрыл вкладку Chrome, после чего все остальное который ждал, вернул результат.
Мое лучшее предположение заключается в том, что Chrome пытался сохранить сеанс открытым, а Flask блокировал последующие запросы. Как только соединение с Chrome было остановлено или reset, все остальные были обработаны.
В моем случае нарезание резьбы фиксировало его. Конечно, теперь я просматриваю некоторые из ссылок, которые другие предоставили, чтобы убедиться, что это не вызовет каких-либо других проблем.
Ответ 5
threaded=True
работает для меня, но, наконец, я понял, что проблема связана с foxyproxy на firefox. Поскольку, когда приложение для фляшек работает на локальном хосте, медленный ответ возникает, если
- foxyproxy включен в firefox
медленный ответ не произойдет, если
Единственное решение, которое я нашел, - отключить foxyproxy, попытаться добавить localhost в черный список и настроить настройки, но никто из них не работал.
Ответ 6
Я использовал ответ Михеко, чтобы решить мою проблему.
::1 localhost
уже был закомментирован в моем файле hosts, и настройка Threaded=true
у меня не сработала. Каждый запрос REST занимал 1 секунду, а не мгновенный.
Я использую Python 3.6, и я получил флешку, которая будет быстрой и реагирует на запросы REST, заставив флягу использовать gevent в качестве WSGI.
Чтобы использовать gevent, установите его с помощью pip install gevent
После этого я использовал https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41, чтобы настроить флягу на использование gevent.
Incase ссылка идет вниз, вот важные части скрипта:
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()
Ответ 7
Я получил эту ошибку при запуске на хостах, отличных от localhost
, поэтому для некоторых из них могут возникнуть те же самые симптомы, что и другие основные проблемы.
Я переключил большинство вещей, которые я использовал в Tornado, и, как ни странно, это помогло. У меня было несколько медленных загрузок страниц, но все кажется более отзывчивым. Кроме того, очень анекдотично, но я, кажется, замечаю, что Flask один будет замедляться с течением времени, но Flask + Tornado меньше. Я предполагаю, что использование Apache и mod_wsgi
улучшит ситуацию, но Tornado действительно прост в настройке (см. http://flask.pocoo.org/docs/deploying/others/).
(Кроме того, связанный с этим вопрос: приложение для фляжки иногда висит)
Ответ 8
У меня здесь было другое решение. Я просто удалил все .pyc
из каталога сервера и снова запустил его.
Кстати, localhost уже был закомментирован в файле моих хостов (Windows 8).
Сервер замерзал все время, и теперь он отлично работает.