#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 месяцев спустя, но, надеюсь, это может помочь другим…