python的fastapi、tornado、flask框架并发探索

本文对比测试了FastAPI、Tornado和Flask三个Python Web框架的并发性能,包括它们在直接部署及通过Nginx代理时的表现。结果显示FastAPI表现最佳,而Tornado需要额外配置才能实现高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖人称王某人的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值