Медленные запросы на локальном сервере Колб


только начинаю играть с колбой на локальном сервере, и я замечаю, что время запроса/ответа намного медленнее, чем я чувствую, что они должны быть.

просто простой сервер, как показано ниже, занимает около 5 секунд, чтобы ответить.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "index"

if __name__ == "__main__":
    app.run()

какие идеи? Или это просто как локальный сервер?

7 66

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", но я хочу дать некоторый фон, чтобы отличить мою проблему от других, для которых это может не сделать.

  1. моя проблема возникла только при запуске колбы с python3. Переход на python2, у меня больше не было этой проблемы.
  2. моя проблема проявляется только при доступе к 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/).

(также связанный с этим вопрос: колба приложение иногда висит)

У меня было другое решение здесь. Я просто удалил все .pyc из каталога сервера и запустил его снова. Кстати, localhost уже был закомментирован в моем файле hosts (Windows 8).

сервер замерзал все время, и теперь он снова работает нормально.