python - 简单的 Flask 项目运行缓慢
问题描述
我开始使用 Flask,并且发现了一些奇怪的延迟问题。
Flask 代码是最简单的“Hello World!” 如下:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
它使用 VM 和 Gunicorn 安装在远程 Ubuntu 18 服务器上,如下所示:
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.7s 到 1s 之间,对于这样一个简单的函数来说似乎很慢。阅读类似部署后,我的印象是这个调用应该快得多。
这个功能可以加速吗?
我努力了:
- 硬编码 IP 地址
- 禁用 IPv6
- 在 app.run() 中设置 threaded=True
- 从浏览器调用网址
这些都没有任何区别。
另外,服务器在澳大利亚,而我在英国。这会导致减速吗?
解决方案
是的,去半个地球(尤其是澳大利亚,据我所知)会导致延迟。只是简单地使用芬兰这里的 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
我最好的猜测是您的结果区域可能是缓慢的 VPS和环游世界的复合效应。
推荐阅读
- xamarin - 如何在 Azure 管道上构建 Xamarin.Mac 应用
- ruby-on-rails - 在 Devise Rails 中注册新用户之前更新服装字段
- swift - 如何实例化两个相互依赖的泛型类?
- android - Android webview 无法播放 mp4 格式以外的视频
- c - 8.5 K&R 书中更简单的代码,只有逻辑运算符而不是位运算和逻辑运算符
- angular - Angular 8 部署问题:Uncaught SyntaxError: Unexpected end of input error
- flutter - 如何转换流
列出 - redis - 需要知道哪些键被更频繁地访问
- java - Java8 - 如何将嵌套映射转换为按内部映射键值收集的嵌套映射列表
- android - 基于 API 级别的 GreenRobot EventBus 订阅