python的fastapi、tornado、flask框架并发探索
- 一、环境
- 二、框架
-
- 1、fastapi
-
- 1)代码
- 2)结果
-
- a、未经过Nginx代理
- b、经过Nginx代理
- 2、tornado
-
- 1)代码
- 2)结果
-
- a、未经过Nginx代理
- b、经过Nginx代理
- 3、flask
-
- 1)代码
- 2)结果
-
- a、未经过Nginx代理
- b、经过Nginx代理
- 4、Nginx配置
- 三、总结
一、环境
阿里云轻量服务器,1核2G,带宽5M
测试并发用的JMeter,1000个进程同时发送
二、框架
1、fastapi
1)代码
#!/usr/bin/env python
# coding: utf-8
import uvicorn
from fastapi import FastAPI,Request
app = FastAPI()
@app.get("/ip")
async def root(request: Request):
result={
"ip":request.client.host,
"x-real-ip":request.headers.get("X-Real-Ip",""),
"x-forwarded-for":request.headers.get("x-forwarded-for","")
}
return result
if __name__ == '__main__':
uvicorn.run("fastapiMain:app", host="0.0.0.0", port=5000, log_level="info", reload=True, debug=True,forwarded_allow_ips ='*')
2)结果
a、未经过Nginx代理
b、经过Nginx代理
2、tornado
1)代码
import tornado.ioloop
import tornado.web
class IndexHandler(tornado.web.RequestHandler):
def set_default_headers(self):
self.set_header('Access-Control-Allow-Origin', "*")
@tornado.gen.coroutine#异步处理
def get(self):
result={
"ip":self.request.remote_ip,
"X-Real-Ip":self.request.headers.get("X-Real-Ip",""),
"X-Forwarded-For":self.request.headers.get("X-Forwarded-For","")
}
self.write(result)
def make_app():
return tornado.web.Application([
(r"/ip", IndexHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(5000)
tornado.ioloop.IOLoop.current().start()
2)结果
a、未经过Nginx代理
有@tornado.gen.coroutine
注释 @tornado.gen.coroutine#异步处理
b、经过Nginx代理
注释 @tornado.gen.coroutine#异步处理
3、flask
1)代码
from flask import Flask, request
app = Flask(__name__)
@app.route('/ip')
def index():
result={
"ip":request.remote_addr,
"X-Real-Ip":request.headers.get("X-Real-Ip",""),
"X-Forwarded-For":request.headers.get("X-Forwarded-For","")
}
return result
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True,port=5000)
2)结果
a、未经过Nginx代理
b、经过Nginx代理
4、Nginx配置
server{
listen 8080;
server_name localhost;
location /api/{
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:5000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
简单的解释一下,监听8080端口,匹配以/api/开头的路由,并且重写路由,将/api/去掉,将请求给127.0.0.1:5000处理,添加四个属性到请求header
例如我请求http://www.ahutwyc.tech:8080/api/ip,那么就会被代理到http://127.0.0.1:5000/ip,当然这里127.0.0.1就是服务器内部的网络了。
三、总结
这里发现 经过Nginx代理之后的延迟和错误率反而上升,很可能是nginx和api接口在同一个服务器上,增加了服务器负担,同时服务器是1核的的,没有并行,而并发又少的可怜,即使nginx可以高并发处理请求,奈何后端高并发跟不上;从效果上看,fastapi性能很不错,flask2+版本之后呢也实现了高并发功能,因此性能也不错,而tornado貌似要自己加上装饰器才可以,不知道猜测对不对,大家有想法还是自己跑一跑看看一看。