Sanic异步框架真的这么强吗?实践中找真理
Sanic异步框架真的这么强吗?实践中找真理,通过对Sanic、Flask、Spring三个框架进行压力测试得出答案!
目录
- Sanic异步框架真的这么强吗?实践中找真理,通过对Sanic、Flask、Spring三个框架进行压力测试得出答案!
- 前言
- 一、Sanic是什么?
- 二、压测工具ab
- 三、测试步骤
- 1.代码实例:
- 2.测试过程
- ab工具
- 测试结果:
- 3.Sanic:是时候表演真正的技术了
- Sanic提升性能小秘诀
- 最终测试结果:
- 总结
前言
随着人工智能项目的逐渐普及,人工智能项目目前主流的开发语言仍然是python,所以使用python作为算法对外的api需求逐渐增大。那么问题来了,目前主流的python web框架主要是flask、django、fastapi等,但受限与python是一门解析语言,其运行效率整体来说并不高(同时受困于全局解释器锁GIL,无法像java的框架一样做到真正的多线程),所以异步框架的需求应声而出,那么我将通过以下测试,对比flask、sanic以及java的spring,进行一个简单的api接口测试,生成该对比文档。
一、Sanic是什么?
Sanic 是一个基于 Python 3.5+ 的 web 框架,依托于 uvloop、asyncio 等事件循环和异步并发模块,旨在提供支持异步高并发请求的 web 服务。
我这边不做具体描述,详细可以参考下面的链接。我归类为两点:
① 支持异步高并发请求的 web 服务
② Sanic 的使用和 Flask 非常相似
③ 搭建轻量级 Restful API 微服务,服务于企业或者团队内部
④ uvloop 可以使 asyncio 更快。事实上,它至少比 nodejs、gevent 和其他 Python 异步框架要快两倍 。基于 uvloop 的 asyncio 的速度几乎接近了 Go 程序的速度。
sanic简介
二、压测工具ab
ab是Apache自带的压力测试工具。ab非常实用,它不仅可以对Apache服务器进行网站访问压力测试,也可以对其它类型的服务器进行压力测试。比如Nginx、Tomcat、IIS等。
使用ab命令进行压力测试
ab命令可以查询,举一个比较常用的例子:
ab -n 100 -c 10 http://localhost:5000-n 100表示请求总数为100
-c 10表示并发用户数为10表示请求的目标URL
这行表示处理100个请求并每次同时运行10次请求。
三、测试步骤
1.代码实例:
sanic:
from sanic import Sanic
from sanic.response import textapp = Sanic("MyHelloWorldApp")@app.get("/")
async def hello_world(request):return text("Hello!!!")if __name__ == '__main__':app.run(port=5001, host='0.0.0.0',debug=False)# 下面的代码也可以,当时为了保证代码一致性,定义好返回response的格式。但是速度都是一致的,不影响。
from sanic import Sanic
from sanic.response import jsonapp = Sanic("MyHelloWorldApp")@app.get("/")
async def test(request):return json({"hello": "world"})if __name__ == "__main__":app.run(port=5001, host='0.0.0.0',debug=False)
flask:
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return "Hello!!!"if __name__ == '__main__':app.run('0.0.0.0', port=5000,debug=False)# 下面的代码也可以,当时为了保证代码一致性,定义好返回response的格式。但是速度都是一致的,不影响。
from flask import Flask, make_responseapp = Flask(__name__)@app.route('/')
def hello_world():# return "Hello!!!"resp = make_response("Hello!!!")return respif __name__ == '__main__':app.run('0.0.0.0', port=5000,debug=False)
java:
java略,封装好jar包。同样的返回内容。
flask占用端口5000,Sanic占用5001,Spring占用10001
2.测试过程
ab工具
-n:即requests,用于指定压力测试总共的执行次数
-c:即concurrency,用于指定的并发数
测试命令如下,共20000次请求,并发为1000:
ab -n 20000 -c 1000 127.0.0.1:5000/ # Flask
ab -n 20000 -c 1000 127.0.0.1:5001/ # Sanic
ab -n 20000 -c 1000 127.0.0.1:10001/ # Spring
测试结果:
测试结果我不贴图了,内容比较多切复杂,这里收集几个较为重要的参数作为参考。结果值我是采用每次测试三次取最高值。一般每个框架第一次调用都会相对慢一些。
框架名 |
Time taken for tests (压力测试消耗的总时间) |
Failed requests: (失败的请求数) Complete requests: (的总次数) |
Requests per second: (平均每秒的请求数) 重要参数,代表服务器的吞吐量 |
---|---|---|---|
Flask | 37.449s | 0/20000 | 534.07 |
Flask+gunicorn | 4.630s | 0/20000 | 4319.60 |
Sanic | 10.363s | 0/20000 | 1929.99 |
Spring | 3.652s | 0/20000 | 5477.01 |
3.Sanic:是时候表演真正的技术了
看了一下上面的测试结果,会不会发现,怎么好像Sanic也没有想象中,传说中那么强,Flask只需要通过使用gunicorn作为wsgi服务器,一样可以弥补使用原生web服务的缺点。可以充分发挥服务器的性能。
经过查阅资料发现,其实是我们配置方面没有填好。首先Sanic 自带了一个 Web 服务器。在大多数情况下,推荐使用该服务器来部署Sanic 应用,然后只需要通过修改一下app.run()里面的一些参数即可提升Sanic的性能了。
Sanic提升性能小秘诀
"""
fast:获得最大 CPU 性能的最简单方法是使用 fast 参数。这将自动以系统最大的核心数量来创建工作线程。access_log: 关闭输出访问日志来提升性能。
"""
app.run(port=5001, host='0.0.0.0',debug=False,access_log=False,fast=True)
ab测试信息:
Server Software:
Server Hostname: 127.0.0.1
Server Port: 5001Document Path: /
Document Length: 17 bytesConcurrency Level: 100
Time taken for tests: 3.214 seconds
Complete requests: 20000
Failed requests: 0
Write errors: 0
Total transferred: 2140000 bytes
HTML transferred: 340000 bytes
Requests per second: 6221.97 [#/sec] (mean)
Time per request: 16.072 [ms] (mean)
Time per request: 0.161 [ms] (mean, across all concurrent requests)
Transfer rate: 650.15 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median max
Connect: 0 6 2.9 6 18
Processing: 1 10 4.1 10 42
Waiting: 1 8 3.4 8 37
Total: 1 16 5.1 17 44Percentage of the requests served within a certain time (ms)50% 1766% 1875% 1980% 2090% 2195% 2398% 2599% 27100% 44 (longest request)
最终测试结果:
框架名 |
Time taken for tests (压力测试消耗的总时间) |
Failed requests: (失败的请求数) Complete requests: (的总次数) |
Requests per second: (平均每秒的请求数) 重要参数,代表服务器的吞吐量 |
---|---|---|---|
Flask | 37.449s | 0/20000 | 534.07 |
Flask+gunicorn | 4.630s | 0/20000 | 4319.60 |
Sanic(优化后) | 3.214s | 0/20000 | 6221.97 |
Spring | 3.652s | 0/20000 | 5477.01 |
总结
通过上面的亲测,Sanic的确在性能方面,确实是不错的选择。虽然说这次测试只是单纯的一个get请求,并没有涉及到一些内部的异步任务等等(毕竟今天要测试的是框架本身,而不是从借助外部工具的角度来说,毕竟工具,你我他,都能用的。) 性能上能够跟java的框架不分伯仲,甚至是稍微领先一丢丢,也是让人觉得惊喜的。况且,Sanic可是用自己内部的web服务器,并没有通过gunicorn等。
不过Sanic的生态,还是得继续加油,在https://python.libhunt.com/,甚至连具体信息都不全,就很离谱。。 不过庆幸的是,Sanic的官网(我下面插了链接,百度搜索不了的)做的挺不错的,有很具体的案例讲解,最最最重要,有官方中文文档选择,终于不需要网页翻译了。
Sanic官网,百度搜索不了
以上就是这次测试的全部内容,有不足的请多多指教。其实无论是语言也好,框架也好,肯定也是咸鱼白菜,各有所爱,保持热情,做喜欢做的事情,同时能做好它,足矣
Sanic异步框架真的这么强吗?实践中找真理相关推荐
- 【小伟哥AI之路】Python之sanic异步框架使用精解
快速开始 在安装Sanic之前,让我们一起来看看Python在支持异步的过程中,都经历了哪些比较重大的更新. 首先是Python3.4版本引入了asyncio,这让Python有了支持异步IO的标准库 ...
- 从无栈协程到C++异步框架
导语 在前面的文章中我们尝试从 C++17 和 C++20 的角度分别探讨过其中无栈协程的包装机制和使用, 但其中的设计由来, 原理, 剥析的并不多. 这也导致对相关特性不太熟悉的读者要理解相关内容存 ...
- 从无栈协程到 C++异步框架
作者:fangshen,腾讯 IEG 游戏客户端开发工程师 导语 本文我们将尝试对整个 C++的协程做深入浅出的剥析, 方便大家的理解. 再结合上层的封装, 最终给出一个 C++异步框架实际业务使用的 ...
- 月薪40k+测试·开发同步认可的FastAPI:Python 世界里最受欢迎的异步框架
目录 介绍: 这次我们来聊一聊 FastAPI,它和我们之前介绍的 Sanic 是类似的,都是 Python 中的异步 web 框架.相比 Sanic,FastAPI 更加的成熟.社区也更加的活跃,那 ...
- jQuery异步框架探究1:jQuery._Deferred方法
jQuery异步框架应用于jQuery数据缓存模块.jQuery ajax模块.jQuery事件绑定模块等多个模块,是jQuery的基础功能之中的一个.实际上jQuery实现的异步回调机制能够看做ja ...
- 基于SEDA的异步框架设计与实现
基于SEDA的异步框架设计与实现 一.SEDA国内外研究现状 1.SEDA架构的起源和特点 当前最流行的互联网服务器模型基本都是基于多线程/进程并发服务模型.然而当线程数目增加到一定值后,系统性 ...
- GMTC | 《小程序跨框架开发的探索与实践》演讲全文
前言:随着小程序开发的热度上升,小程序开发框架也层出不穷.但目前每个框架都会绑定一个专属 DSL,如类 React 或者类 Vue,在一个框架内,开发者无法根据团队技术栈自由选择 DSL,同时也无法共 ...
- 【NLP】文本分类还停留在BERT?对偶对比学习框架也太强了
论文简介:对偶对比学习:如何将对比学习用于有监督文本分类 论文标题:Dual Contrastive Learning: Text Classification via Label-Aware Da ...
- 【NLP】文本分类还停留在BERT?对偶比学习框架也太强了
论文简介:对偶对比学习:如何将对比学习用于有监督文本分类 论文标题:Dual Contrastive Learning: Text Classification via Label-Aware Da ...
最新文章
- python控制电机_利用树莓派控制步进电机——Python语言
- 秘籍 | 机器学习数据集网址大全
- 智源重大研究方向“智能体系架构与芯片”发布会(活动报名)
- 最短路问题的原始对偶算法形式
- 数据分析行业需要具备哪些技术 如何快速进入
- MapTask并行度决定机制、FileInputFormat切片机制、map并行度的经验之谈、ReduceTask并行度的决定、MAPREDUCE程序运行演示(来自学笔记)
- 原来还有dynamic这东西。
- multipartfile前端怎么传_前端那些事如何更好管理 Api 接口
- BZOJ 2115 Wc2011 Xor DFS+高斯消元
- C++中有关queue常用函数的用法及其注意要项
- 暴力枚举也不能没有底线(洛谷P1003题题解,Java语言描述)
- 使用Fargate在AWS ECS中部署ASP.NET Core 微服务
- Linux rescue救援(光盘修复)模式详解
- SpringCloud的Eureka客户端(解决自动退出问题)
- Chronos首页、文档和下载 - 作业调度器 - 开源中国社区
- java 反解析cron_Java解析Cron表达式
- Contexts for mac(程序快速调用工具)
- OpenCV实现人体姿态估计(人体关键点检测)OpenPose(图像、视频或调用摄像头均能实现)
- 2进制快速转换为16进制
- cvpr 深度估计_近两年 CVPR ICCV ECCV 相机位姿估计、视觉定位、SLAM相关论文汇总...