Подтвердить что ты не робот

Медленные запросы на локальный сервер фляг

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

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

from flask import Flask

app = Flask(__name__)

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

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

Любые идеи? Или это как раз то, как локальный сервер?

4b9b3361

Ответ 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 отключен в 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).

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