meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能对比测试

本文会使用如下两个项目:meinheld-gunicorn-flask 与 uvicorn-gunicorn-fastapi

前文有测过 Flask vs FastApi 性能对比测试,可能不够有说服力,这次使用了号称最快的wsgi或asgi服务器+gunicorn来运行flask或fastapi。

上面meinheld-gunicorn-flask和uvicorn-gunicorn-fastapi项目都是由fastapi的作者发起,致力于使用flask或fastapi开发高性能后端应用,然后用docker的方式快速部署。文末会给出测试结论。

名词解释

meinheld:高性能wsgi服务器
uvicorn:高性能asgi服务器
gunicorn:用来管理meinheld或uvicorn的运行,比如用多进程/多线程的方式运行meinheld或uvicorn,以便最大化性能来运行flask或fastapi程序。

测试环境

Ubuntu 22.04系统,CPU 16核,内存32G。

一、创建 meinheld-gunicorn-flask-test 目录,目录结构为
meinheld-gunicorn-flask-test
├── Dockerfile
├── app
│   ├── main.py
│   └── prestart.sh  # 可以不要这个文件
└── requirements.txt

Dockerfile内容:

FROM tiangolo/meinheld-gunicorn-flask:python3.9COPY ./requirements.txt /app/requirements.txtRUN pip install --no-cache-dir --upgrade -r /app/requirements.txtCOPY ./app /app

requirements.txt 内容

blinker==1.8.2
click==8.1.7
Flask==3.0.3
importlib_metadata==7.1.0
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
Werkzeug==3.0.3
zipp==3.18.2

app/main.py 内容

from flask import Flaskapp = Flask(__name__)@app.route('/', methods=['GET'])
def root():return {"Hello": "Flask"}

构建docker镜像:

cd meinheld-gunicorn-flask-test/
docker build -t meinheld-gunicorn-flask-test:1.0.0 .

运行docker容器:

docker run -d --name meinheld-gunicorn-flask-test -p 8080:80 meinheld-gunicorn-flask-test:1.0.0
二、创建 uvicorn-gunicorn-fastapi-test 目录,目录结构为:
uvicorn-gunicorn-fastapi-test
├── Dockerfile
├── app
│   ├── main.py
│   └── prestart.sh  # 可以不要这个文件
└── requirements.txt

Dockerfile内容:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.10COPY ./requirements.txt /app/requirements.txtRUN pip install --no-cache-dir --upgrade -r /app/requirements.txtCOPY ./app /app

requirements.txt 内容

annotated-types==0.7.0
anyio==4.3.0
certifi==2024.2.2
click==8.1.7
dnspython==2.6.1
email_validator==2.1.1
exceptiongroup==1.2.1
fastapi==0.111.0
fastapi-cli==0.0.4
h11==0.14.0
httpcore==1.0.5
httptools==0.6.1
httpx==0.27.0
idna==3.7
Jinja2==3.1.4
markdown-it-py==3.0.0
MarkupSafe==2.1.5
mdurl==0.1.2
orjson==3.10.3
pydantic==2.7.1
pydantic_core==2.18.2
Pygments==2.18.0
python-dotenv==1.0.1
python-multipart==0.0.9
PyYAML==6.0.1
rich==13.7.1
shellingham==1.5.4
sniffio==1.3.1
starlette==0.37.2
typer==0.12.3
typing_extensions==4.12.0
ujson==5.10.0
uvicorn==0.29.0
uvloop==0.19.0
watchfiles==0.21.0
websockets==12.0

app/main.py 内容

from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"Hello": "FastA"}

构建docker镜像:

cd uvicorn-gunicorn-fastapi-test/
docker build -t uvicorn-gunicorn-fastapi-test:1.0.0 .

运行docker容器:

docker run -d --name uvicorn-gunicorn-fastapi-test -p 8081:80 uvicorn-gunicorn-fastapi-test:1.0.0

性能测试

这里使用ab工具测试并发。先把最大打开文件数调大,执行命令:ulimit -n 65535

# 测试flask,并发3000,连接数10万
ab -n 100000 -c 3000 http://127.0.0.1:8080/Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requestsServer Software:        meinheld/1.0.2
Server Hostname:        127.0.0.1
Server Port:            8080Document Path:          /
Document Length:        18 bytesConcurrency Level:      3000
Time taken for tests:   7.209 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      16900000 bytes
HTML transferred:       1800000 bytes
Requests per second:    13871.03 [#/sec] (mean)
Time per request:       216.278 [ms] (mean)
Time per request:       0.072 [ms] (mean, across all concurrent requests)
Transfer rate:          2289.26 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0   99  12.5     99     148
Processing:    36  113  20.7    110     346
Waiting:        1   82  18.0     80     317
Total:        109  213  18.1    208     430Percentage of the requests served within a certain time (ms)50%    20866%    21275%    21880%    22590%    23495%    24298%    25299%    258100%    430 (longest request)

下面是fastapi:

# 测试fastapi,并发3000,连接数10万
ab -n 100000 -c 3000 http://127.0.0.1:8081/Benchmarking 127.0.0.1 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requestsServer Software:        uvicorn
Server Hostname:        127.0.0.1
Server Port:            8081Document Path:          /
Document Length:        17 bytesConcurrency Level:      3000
Time taken for tests:   7.198 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      14200000 bytes
HTML transferred:       1700000 bytes
Requests per second:    13892.29 [#/sec] (mean)
Time per request:       215.947 [ms] (mean)
Time per request:       0.072 [ms] (mean, across all concurrent requests)
Transfer rate:          1926.47 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0   88  10.2     88     138
Processing:    44  124  25.8    121     223
Waiting:        1   94  27.8     82     200
Total:         99  213  24.7    208     324Percentage of the requests served within a certain time (ms)50%    20866%    22375%    22980%    23290%    24295%    25698%    27999%    287100%    324 (longest request)
结论:

fastapi(13892.29) 和 flask(13892.29)并发量几乎一样,看来 meinheld 的性能确实很高。甚至在 ab 参数 -n 100000 -c 1000 的情况下,多次测试后,fastapi和flask并发数各有胜负。

因此在开发简单快速的项目时,可以用 meinheld-gunicorn-flask 这套方案。而在需要更多异步编程,需要类型检查,或者docs(Swagger)文档时,可以用 uvicorn-gunicorn-fastapi 这套方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库-SQL性能分析

SQL执行频率 慢查询日志 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有 SQL语句的日志。 MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_l…

html5 笔记02

目录 01 svg的基本使用 02 svg绘图 03 进程和线程 01 svg的基本使用 svg和canvas的区别: canvas: 1.canvas作为一个容器只有一个dom元素 ,内部元素无法使用dom操作 (canvas不能展开然后选择不到 svg查看元素能选中因为是通过标签控制的) 2.canvas 是配合js完成各种绘制效果 …

vue-route的路由配置中父组件没有component怎么处理

概述 为了方便开发和维护,所以web前端的路由配置路径和前端代码文件路径一般是一致的。但在实际开发中,项目可能会分很多级的菜单,由于很多菜单只有叶子菜单是真正的页面。而中间菜单项只是一个路由配置。 为了正确路由到底层的功能页面&…

指纹识别概念解析

目录 1. 指纹是物证之首 1.1 起源于中国 1.2 发展于欧洲 1.3 流行于全世界 2. 指纹图像 3. 指纹特征 4. 指纹注册 5. 指纹验证 6. 指纹辨识 1. 指纹是物证之首 指纹识别技术起源于中国、发展于欧洲、流行于全世界。自20世纪以来,指纹在侦破刑事案件、解决诉…

水泥超低排平台哪家好?

随着环保政策的加强和绿色发展理念的深入人心,水泥行业的超低排放改造已成为行业发展的新趋势。选择一个合适的水泥超低排平台对于确保改造效果和实现企业的可持续发展至关重要。朗观视觉小编将从多个角度出发,为您提供一份综合评估与选择攻略&#xff0…

Spring Boot 3.x 与 Spring Boot 2.x 的对比

Spring Boot 是 Java 开发领域的一个重要框架,它简化了基于 Spring 的应用开发。随着版本的不断更新,Spring Boot 提供了更多功能、更好的性能以及更简洁的配置。本文将详细对比 Spring Boot 3.x 和 Spring Boot 2.x,探讨它们之间的主要区别和…

[C语言]自定义类型详解:结构体、联合体、枚举

目录 🚀结构体 🔥结构体类型的声明 🔥结构的自引用 🔥结构体变量的定义和初始化 🔥结构体内存对齐 🔥结构体传参 🔥结构体实现位段(位段的填充&可移植性) &a…

安装 Ubuntu桌面版,详细步骤(附引导 U盘制作工具)

下载镜像 安装Ubuntu首先要下载镜像包,访问下面网址下载镜像包 https://releases.ubuntu.com/ 选择你要安装的Ubuntu版本 将 .iso 文件保存到所需位置,下面会使用此文件创建可引导 U盘。 制作 Ubuntu 引导 U 盘 首先要找到一个大于4G的U盘&#xff…

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC?

猫头虎 解析:为什么AIGC在国内适合做TOB,在国外适合做TOC? 博主 猫头虎 的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面…

ps进程查看命令详解

1、PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照。它能捕获系统在某一事件的进程状态。如果你想不断更新查看的这个状态,可以使用top命令。 2、ps命令支持三种使用的语法格式 UNIX 风格,选项可以组合在一起…

鸿蒙ArkUI-X平台差异化:【运行态差异化(@ohos.deviceInfo)】

平台差异化 简介 跨平台使用场景是一套ArkTS代码运行在多个终端设备上,如Android、iOS、OpenHarmony(含基于OpenHarmony发行的商业版,如HarmonyOS Next)。当不同平台业务逻辑不同,或使用了不支持跨平台的API&#xf…

c++中静态函数

在Qt中,可以通过在类中定义静态方法来添加静态方法。静态方法是类的一部分,但不需要实例化类对象就可以直接调用。 下面是一个示例,演示了如何在类中添加静态方法: cpp class MyClass { public: static void myStaticMethod…

Postman快捷功能-批量断言与快速查询替换

大家好,在我们日常的接口测试工作中,经常需要对接口返回的数据进行断言,以确保接口的正确性。当接口数量较多时,逐个编写断言语句会变得非常繁琐。此外,在接口测试过程中,我们还可能需要频繁地查找和替换某…

Python自动化工具(桌面自动化、Web自动化、游戏辅助)

工具介绍 连点工具是一款可以模拟键鼠后台操作的连点器工具。支持鼠标连点、键鼠脚本录制,支持辅助您实现办公自动化以及辅助游戏操作。功能简洁易用,非常方便操作。连点工具让您在在玩游戏、网购抢购的时候全自动点击鼠标!主要功能有&#…

MySQL数据库的数据文件保存在哪?MySQL数据存在哪里

在安装好MySQL数据库使用一段时间后,会产生许多的数据库和数据。那这些数据库的数据文件存放在本地文件夹的什么位置呢 一、默认位置 一般来说MySQL数据库的数据文件都是存放在data文件夹之中,但是根据使用的存储引擎不同,产生的一些文件也…

牛客前端面试高频八股总结(2)(附文档)

1.fetch请求方式 fetch是什么? fetch是一种http 数据请求的方式,是xml的一种替代方式。 怎么请求? fetch方法返回一个promise解析response显示状态(成功与否)的方法。 优点: 使用Promise,支持链…

24李林跌落神坛,880还刷吗?还是换1000、900、660?

“李林今年跌落神坛了!” “全是固定题型没新题,结果今年考的全是新题。” 880是“老真题的神”, 遇到24年,冷门考点多,计算量又大,就不灵了。 但“老真题”,还是得刷。就像往年真题是要刷的…

(十一)统计学基础练习题五(50道选择题)

本文整理了统计学基础知识相关的练习题,共50道,适用于想巩固统计学基础或备考的同学。来源:如荷学数据科学题库(技术专项-统计学二)。序号之前的题请看往期文章。 201) 202) 203) 2…

得帆信息PMO总监李健达受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 上海得帆信息技术有限公司aPaaS业务线副总裁、PMO总监李健达先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“AI时代的PMO工作法”。大会将于6月29-30日在北京举办,敬请关注! 议题简要&#x…

39. 组合总和 - 力扣(LeetCode)

基础知识要求: Java: 方法、集合、泛型、Arrays工具类、for循环、if判断 Python: 方法、列表、for循环、if判断 题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使…