Простой проект Flask выполняется медленно

#python #flask

#python #flask

Вопрос:

Я начинаю работать с Flask и нахожу некоторые странные проблемы с задержкой.

Код Flask является самым простым из возможных «Привет, мир!» следующим:

 from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"
if __name__ == "__main__":
    app.run()
  

и он устанавливается на удаленный сервер Ubuntu 18 с использованием виртуальной машины и Gunicorn следующим образом:

 gunicorn -b 0.0.0.0:5000 app:app --reload
  

Я использую библиотеку Python ‘requests’ для вызова сервера под управлением Windows 10 следующим образом:

 import requests, time

url = 'http://vps.XXXXX.ssdhosts.com.au:5000/'

t0 = time.time()
response = requests.get(url)                       
t1 = time.time()
total = t1-t0
print("Simple get request took " , total)
  

Проблема в том, что время вызова удаленной функции всегда занимает от 0,7 с до 1 с, что кажется медленным для такой простой функции. У меня сложилось впечатление, что этот вызов должен быть намного быстрее, прочитав о подобных развертываниях.

Можно ли ускорить эту функцию?

Я пытался:

  • жестко кодируем IP-адрес
  • отключение IPv6
  • установка threaded= True в app.run()
  • вызов веб-адреса из браузера

Ничто из этого не имеет никакого значения.

Кроме того, сервер находится в Австралии, в то время как я нахожусь в Великобритании. Приведет ли это к замедлению?

Ответ №1:

Да, поездка на другой конец света (особенно в Австралию, как я понимаю) приведет к задержке. Просто используя Speedtest.net отсюда, из Финляндии, говорят, что задержка до Сиднея составляет 330 мс, до моего ближайшего тестового сервера — 5 мс.

Я повторил ваши шаги на компьютере Digital Ocean в Амстердаме:

 ~# cd $(mktemp -d)
/tmp/tmp.4ahzWvNRpX# python3.5 -m venv venv
/tmp/tmp.4ahzWvNRpX# source venv/bin/activate
(venv) /tmp/tmp.4ahzWvNRpX# pip install flask gunicorn
(venv) /tmp/tmp.4ahzWvNRpX# cat > app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"
if __name__ == "__main__":
    app.run()
(venv) /tmp/tmp.4ahzWvNRpX# gunicorn -b 0.0.0.0:5000 app:app --reload
  

и на моем Mac, с тем же тестовым кодом, что и у вас, я получаю вполне терпимые 60 мсек.

 ~/Desktop $ python3 x.py
Simple get request took  0.06290006637573242
~/Desktop $ python3 x.py
Simple get request took  0.06206989288330078
~/Desktop $ python3 x.py
Simple get request took  0.0690619945526123
~/Desktop $ python3 x.py
Simple get request took  0.06926107406616211
~/Desktop $
  

С uwsgi сервером приложений ( uwsgi --http :5000 --master --wsgi app:app ) результаты аналогичны ( uwsgi сам сообщает, что для фактического получения ответа от кода требуется менее 1 мс), но я предполагаю, что они были бы лучше при большем масштабе параллелизма.

Мое лучшее предположение, что ваша область результатов является сложным эффектом, возможно, медленного VPS и распространения по всему миру.

Комментарии:

1. Это имеет смысл. Проверка IP-адреса моего сервера показывает, что среднее время прохождения туда и обратно составляет около 350 мс. Так что я предполагаю, что в настройке нет ничего плохого.

Ответ №2:

вы пробовали давать gunicorn больше одного работника?

добавьте «-w 2» в интерфейс командной строки gunicorn:

gunicorn -w 2 -b 0.0.0.0:5000 app:app --reload

…5 месяцев спустя, но, надеюсь, это может помочь другим…