天天看点

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

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个进程同时发送

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

二、框架

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代理

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

b、经过Nginx代理

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

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

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

注释 @tornado.gen.coroutine#异步处理

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

b、经过Nginx代理

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

注释 @tornado.gen.coroutine#异步处理

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

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代理

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

b、经过Nginx代理

python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结
python的fastapi、tornado、flask框架并发探索一、环境二、框架三、总结

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貌似要自己加上装饰器才可以,不知道猜测对不对,大家有想法还是自己跑一跑看看一看。