Python flask与fastapi性能测试方法介绍
作者:我爱看明朝 时间:2022-12-07 00:10:17
背景
sy项目通过MQ接受业务系统的业务数据,通过运行开发者开发的python脚本执行业务系统与财务系统数据的一致性校验。
sy系统需要每天运行大量的python脚本。目前使用falsk日运行6W+次python脚本,由于性能存在瓶颈,需要引入
新的fastapi框架,来解决cpu、内存性能压榨不够及目前的性能瓶颈。本文目标给出两者的性能测试报告。
给出选择哪个框架的性能数据支撑。
apache ab介绍
apache ab性能测试
安装
yum -y install httpd-tools
部分参数说明
-n 执行的请求总数
-c 并发数, 同时执行的数量, c不能大于n
-p post请求指定的文件
-T header Content-type值,默认为 'text/plain'
测试get请求
ab -c 10 http://127.0.0.1:8081/cppla
测试post请求
ab -n 100 -c 10 -T 'application/json' -p httpjson.txt http://127.0.0.1:8081/cppla1
// httpjson.txt的内容
{"recordId": 123}
测试计划
模拟真实每次请求调用脚本,分别对每一个数量级的请求量进行测试。
请求总数 | 每次并发数 | 每次并发数 | 每次并发数 |
---|---|---|---|
100 | 10 | 100 | 1000 |
1000 | 10 | 100 | 1000 |
10000 | 10 | 100 | 1000 |
20000 | 10 | 100 | 1000 |
30000 | 10 | 100 | 1000 |
40000 | 10 | 100 | 1000 |
50000 | 10 | 100 | 1000 |
60000 | 10 | 100 | 1000 |
80000 | 10 | 100 | 1000 |
测试代码
处理post请求,延时3s返回结果。flask启动20个进程。fastapi启动一个进程。
## flask 代码
# coding: utf-8
from gevent import monkey
from gevent.pywsgi import WSGIServer
import requests
import datetime
import os
from multiprocessing import cpu_count, Process
from flask import Flask, jsonify,request
import json
import traceback
import importlib
from loguru import logger
import time
app = Flask(__name__)
# 执行run方法
@app.route("/cppla1", methods=['POST', 'GET'])
def cppla1():
data = request.json
time.sleep(3)
return data
# 启动监听ip、端口
def run(MULTI_PROCESS):
if MULTI_PROCESS == False:
WSGIServer(('0.0.0.0', 8081), app).serve_forever()
else:
mulserver = WSGIServer(('0.0.0.0', 8081), app)
mulserver.start()
def server_forever():
mulserver.start_accepting()
mulserver._stop_event.wait()
# for i in range(cpu_count()):
for i in range(20):
logger.info('启动进程第几个:{}', i)
p = Process(target=server_forever)
p.start()
if __name__ == "__main__":
# 单进程 + 协程
# run(False)
# 多进程 + 协程
log_init()
run(True)
## fastapi
# coding: utf-8
# import web framework
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
# import base lib
import datetime
import os
import requests
import json
import traceback
import importlib
from loguru import logger
import time
app = FastAPI()
@app.post("/cppla1")
def function_benchmark(data:dict):
time.sleep(3)
return {"item": data}
# 启动监听ip、端口
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8081)
测试结果
框架类型 | 请求总数 | 每次并发数 | 耗时(s) | 每次并发数 | 耗时(s) | 每次并发数 | 耗时(s) |
---|---|---|---|---|---|---|---|
fastapi | 100 | 10 | 33.119 | 100 | 12.148 | 1000 | ab命令不支持 |
flask | 100 | 10 | 45.088 | 100 | 81.106 | 1000 | ab命令不支持 |
fastapi | 1000 | 10 | 304.057 | 100 | 78.283 | 1000 | 78.631 |
flask | 1000 | 10 | 327.472 | 100 | 198.273 | 1000 | 303.442 |
fastapi | 10000 | 10 | x | 100 | 754.296 | 1000 | 757.719 |
flask | 10000 | 10 | x | 100 | 1550.119 | 1000 | 1970.427 |
fastapi | 20000 | 10 | x | 100 | x | 1000 | x |
flask | 20000 | 10 | x | 100 | x | 1000 | x |
fastapi | 30000 | 10 | x | 100 | x | 1000 | x |
flask | 30000 | 10 | x | 100 | x | 1000 | x |
fastapi | 40000 | 10 | x | 100 | x | 1000 | x |
flask | 40000 | 10 | x | 100 | x | 1000 | x |
fastapi | 50000 | 10 | x | 100 | x | 1000 | x |
flask | 50000 | 10 | x | 100 | x | 1000 | x |
fastapi | 60000 | 10 | x | 100 | x | 1000 | x |
flask | 60000 | 10 | x | 100 | x | 1000 | x |
fastapi | 80000 | 10 | x | 100 | x | 1000 | x |
flask | 80000 | 10 | x | 100 | x | 1000 | x |
结论
fastapi是flask性能的3倍,推荐使用fastap。
来源:https://blog.csdn.net/u013565163/article/details/128048213
标签:Python,flask,fastapi,性能测试
0
投稿
猜你喜欢
对python3 Serial 串口助手的接收读取数据方法详解
2023-05-31 17:39:01
ASP分页和日期格式化为RFC822格式的办法
2008-11-21 15:46:00
python自动化测试selenium屏幕截图示例
2022-07-13 16:55:14
Django与遗留的数据库整合的方法指南
2024-01-15 02:20:32
Python在cmd上打印彩色文字实现过程详解
2022-12-19 07:27:33
解决vue动态路由异步加载import组件,加载不到module的问题
2024-05-29 22:45:37
Go语言并发模型的2种编程方案
2024-04-23 09:34:24
go语言beego框架web开发语法笔记示例
2024-05-21 10:25:22
asp的分词技术
2007-08-25 17:50:00
Pycharm之快速定位到某行快捷键的方法
2022-06-20 14:07:53
Java解析Excel文件并把数据存入数据库
2024-01-22 10:42:26
优化Python代码使其加快作用域内的查找
2021-09-25 06:40:13
语言编程花絮内建构建顺序示例详解
2023-11-04 09:42:12
python基础之文件操作
2022-05-08 11:55:41
python 服务器运行代码报错ModuleNotFoundError的解决办法
2021-03-23 00:39:08
C#/.Net 中快速批量给SQLite数据库插入测试数据
2024-01-27 02:19:36
在ASP与ASP.NET之间共享对话状态(2)
2008-09-02 12:21:00
Python 怎么定义计算N的阶乘的函数
2021-04-12 01:44:04
three.js中文文档学习之创建场景
2023-08-22 21:02:00
SQL Server 磁盘请求超时的833错误原因及解决方法
2024-01-14 00:14:43