Медленные запросы на локальном сервере Колб
только начинаю играть с колбой на локальном сервере, и я замечаю, что время запроса/ответа намного медленнее, чем я чувствую, что они должны быть.
просто простой сервер, как показано ниже, занимает около 5 секунд, чтобы ответить.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
какие идеи? Или это просто как локальный сервер?
7 ответов:
хорошо, я понял это. Похоже, это проблема с Werkzeug и ос, которые поддерживают 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
Как только я это сделаю, проблемы с задержкой исчезнут.
нравится мне флягу и я рад, что это не проблема с рамками. Я знал, что этого не может быть.
добавить "threaded=True" в качестве аргумента для приложения.run (), как предлагается здесь: http://arusahni.net/blog/2013/10/flask-multithreading.html
например:
app.run(host="0.0.0.0", port=8080, threaded=True)
решение для отключения ipv6 не сработало для меня, но это так.
решение от @sajid-siddiqi технически правильно, но имейте в виду, что встроенный WSGI сервер Werkzeug (который упакован в колбы и что он использует для
app.run()
).установить WSGI сервер, чтобы иметь возможность обрабатывать многопоточные поведения. Я сделал кучу исследований по различным WSGI выступления сервер. Ваши потребности могут отличаться, но если все, что вы используете колбы, тогда я рекомендовал бы один из следующих веб-серверов.
Для Python 2.x: gevent
вы можете установить gevent через Пип С помощью команды
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 источник для интеграции колбы: https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py* Примечание: от моего использования PyCharm строка
from meinheld import server
подчеркивается, как ошибка, но сервер будет работать, так что вы можете игнорировать ошибку.
У меня нет репутации, чтобы комментировать, поэтому я добавлю это как "решение". Моя проблема была решена с помощью "threaded=True", но я хочу дать некоторый фон, чтобы отличить мою проблему от других, для которых это может не сделать.
- моя проблема возникла только при запуске колбы с python3. Переход на python2, у меня больше не было этой проблемы.
- моя проблема проявляется только при доступе к api с помощью Chrome, в этот момент Chrome отобразил ожидаемый экран, но все остальное зависало (curl, ffx и т. д.), Пока я не перезагрузил или не закрыл вкладку Chrome, и в этот момент все остальное, что ждало вокруг, вернуло результат.
Я предполагаю, что Chrome пытался сохранить сеанс открытым, а Flask блокировал последующие запросы. Как только соединение с Chrome было остановлено или сброшено, все остальное было обработано.
в моем случае резьба исправила это. Конечно, я сейчас переживаю некоторые из ссылок, которые другие предоставили, чтобы убедиться, что это не вызовет никаких других проблем.
threaded=True
работает для меня, но, наконец, я понял, что проблема связана с foxyproxy на firefox. С тех пор, когда приложение flask работает на localhost, медленный ответ происходит, если
- foxyproxy включен в firefox
медленный ответ не произойдет, если
foxyproxy отключен в firefox
доступ к сайту с помощью других браузеров
единственное решение, которое я нашел, это отключите foxyproxy, попытался добавить localhost в черный список прокси и настроить настройки, но ни один из них не работал.
Я получил эту ошибку при запуске на узлах, кроме
localhost
также, поэтому для некоторых, различные основные проблемы могут проявлять те же симптомы.я переключил большинство вещей, которые я использовал, на Торнадо,и анекдотично это помогло. У меня было несколько медленных загрузок страниц, но все кажется более отзывчивым. Кроме того, очень анекдотический, но я, кажется, замечаю, что колба сама по себе замедлится со временем, но колба + Торнадо меньше. Я представляю себе использование Apache и
mod_wsgi
будет сделать вещи еще лучше, но "торнадо" очень прост в настройке (см. http://flask.pocoo.org/docs/deploying/others/).(также связанный с этим вопрос: колба приложение иногда висит)