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异步框架真的这么强吗?实践中找真理相关推荐

  1. 【小伟哥AI之路】Python之sanic异步框架使用精解

    快速开始 在安装Sanic之前,让我们一起来看看Python在支持异步的过程中,都经历了哪些比较重大的更新. 首先是Python3.4版本引入了asyncio,这让Python有了支持异步IO的标准库 ...

  2. 从无栈协程到C++异步框架

    导语 在前面的文章中我们尝试从 C++17 和 C++20 的角度分别探讨过其中无栈协程的包装机制和使用, 但其中的设计由来, 原理, 剥析的并不多. 这也导致对相关特性不太熟悉的读者要理解相关内容存 ...

  3. 从无栈协程到 C++异步框架

    作者:fangshen,腾讯 IEG 游戏客户端开发工程师 导语 本文我们将尝试对整个 C++的协程做深入浅出的剥析, 方便大家的理解. 再结合上层的封装, 最终给出一个 C++异步框架实际业务使用的 ...

  4. 月薪40k+测试·开发同步认可的FastAPI:Python 世界里最受欢迎的异步框架

    目录 介绍: 这次我们来聊一聊 FastAPI,它和我们之前介绍的 Sanic 是类似的,都是 Python 中的异步 web 框架.相比 Sanic,FastAPI 更加的成熟.社区也更加的活跃,那 ...

  5. jQuery异步框架探究1:jQuery._Deferred方法

    jQuery异步框架应用于jQuery数据缓存模块.jQuery ajax模块.jQuery事件绑定模块等多个模块,是jQuery的基础功能之中的一个.实际上jQuery实现的异步回调机制能够看做ja ...

  6. 基于SEDA的异步框架设计与实现

    基于SEDA的异步框架设计与实现 一.SEDA国内外研究现状 1.SEDA架构的起源和特点    当前最流行的互联网服务器模型基本都是基于多线程/进程并发服务模型.然而当线程数目增加到一定值后,系统性 ...

  7. GMTC | 《小程序跨框架开发的探索与实践》演讲全文

    前言:随着小程序开发的热度上升,小程序开发框架也层出不穷.但目前每个框架都会绑定一个专属 DSL,如类 React 或者类 Vue,在一个框架内,开发者无法根据团队技术栈自由选择 DSL,同时也无法共 ...

  8. 【NLP】文本分类还停留在BERT?对偶对比学习框架也太强了

    论文简介:对偶对比学习:如何将对比学习用于有监督文本分类  论文标题:Dual Contrastive Learning: Text Classification via Label-Aware Da ...

  9. 【NLP】文本分类还停留在BERT?对偶比学习框架也太强了

    论文简介:对偶对比学习:如何将对比学习用于有监督文本分类  论文标题:Dual Contrastive Learning: Text Classification via Label-Aware Da ...

最新文章

  1. python控制电机_利用树莓派控制步进电机——Python语言
  2. 秘籍 | 机器学习数据集网址大全
  3. 智源重大研究方向“智能体系架构与芯片”发布会(活动报名)
  4. 最短路问题的原始对偶算法形式
  5. 数据分析行业需要具备哪些技术 如何快速进入
  6. MapTask并行度决定机制、FileInputFormat切片机制、map并行度的经验之谈、ReduceTask并行度的决定、MAPREDUCE程序运行演示(来自学笔记)
  7. 原来还有dynamic这东西。
  8. multipartfile前端怎么传_前端那些事如何更好管理 Api 接口
  9. BZOJ 2115 Wc2011 Xor DFS+高斯消元
  10. C++中有关queue常用函数的用法及其注意要项
  11. 暴力枚举也不能没有底线(洛谷P1003题题解,Java语言描述)
  12. 使用Fargate在AWS ECS中部署ASP.NET Core 微服务
  13. Linux rescue救援(光盘修复)模式详解
  14. SpringCloud的Eureka客户端(解决自动退出问题)
  15. Chronos首页、文档和下载 - 作业调度器 - 开源中国社区
  16. java 反解析cron_Java解析Cron表达式
  17. Contexts for mac(程序快速调用工具)
  18. OpenCV实现人体姿态估计(人体关键点检测)OpenPose(图像、视频或调用摄像头均能实现)
  19. 2进制快速转换为16进制
  20. cvpr 深度估计_近两年 CVPR ICCV ECCV 相机位姿估计、视觉定位、SLAM相关论文汇总...

热门文章

  1. IDEA类模板设置、快捷方式添加注释
  2. 那些年,我们租过的房子
  3. 如何提高英语的阅读理解【很经典的学习方法】
  4. CEO、CIO、CFO、COO、CTO、CKO,这些职位都是在做什么的?
  5. python返回列表中的最大值(最小值)与其索引
  6. win11系统没有本地用户和组?
  7. 专访贝莱德CEO芬克:如何成为新一代华尔街教父
  8. android分屏底层实现,Android 7.0分屏原理及生命周期
  9. 500万相机芯片尺寸_供应 500万像素 COMS芯片 高清图片效果真实性高 工业相机
  10. Alpha版本测试报告