Python异步编程之web框架异步vs同步 无IO任务压测对比

前言
在python编程中,通过协程实现的异步编程号称能够提高IO密集型任务的并发量。本系列比较web服务器同步框架和异步框架的性能差异,包括无IO接口和常见IO操作,如文件、mysql、redis等。使用压测工具locust测试相同条件下两种编程模式能够处理请求的速度。
测试基本信息
主题:单纯比较异步框架和同步框架的性能,无任何IO
python版本:python 3.8
压测工具:locust
web框架:同步:flask 异步:aiohttp、starlette
请求并发量: 模拟10个用户
服务器配置: Intel(R) i7-12700F
客户端配置:Intel(R) i7-8700 3.20GHz
flask 同步框架
flask是python中轻量级web框架,特点是灵活、轻量级、扩展性高。flask同时是一个同步框架,flask诞生的时候python的异步编程体系还不成熟,当然截止到目前flask肯定是支持异步框架的。但是让其作为同步框架的代表,参加pk。
from flask import Flask, request
app = Flask(__name__)
@app.route('/index')
def index():
return "hello world"
if __name__ == '__main__':
app.run(port=5000, host="0.0.0.0")
压测准备
locust是一个python语言开发的压力测试工具,有图形化界面,基于协程并发,能够支持在单台机器中支持数以千计的模拟用户,也支持分布式压测。
使用locust压测,并发模拟10个用户,10个用户尽可能快的发送请求,并发量RPS取决于请求返回的速度,也就是服务端的处理速度。
from locust import HttpUser, task
class UserBehavior(HttpUser):
# 请求host的/index接口
@task(1)
def stress_index(self):
self.client.get("/index")
locust -f locust_stress.py
访问 127.0.0.1:8098,启动服务,按照10个模拟用户发送请求

压测结果
并发量:463

aiohttp 异步框架
aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块,它既提供了服务端,又提供了客户端。所以可以将aiohttp用于web框架的服务端,监听http请求。
from aiohttp import web
routes = web.RouteTableDef()
@routes.get("/index")
async def index(request):
return web.Response(text="Hello World")
if __name__ == '__main__':
app = web.Application()
app.add_routes(routes)
web.run_app(app)
压测结果
并发量:1455

starlette 异步框架
starlette 是当下火热的异步框架fastapi依赖的唯二模块之一,主要用于异步请求的处理。
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
from uvicorn.main import run
async def index(request):
return JSONResponse({'hello': 'world'})
app = Starlette(debug=True, routes=[Route('/index', index),])
if __name__ == "__main__":
run(app, host="0.0.0.0")
压测结果
并发量:1539

对比
并发曲线图对比:

参数对比:
| 框架 | 并发量 | 延迟 |
|---|---|---|
| flask | 463 | 19 ms |
| aiohttp | 1455 | 6 ms |
| starlette | 1539 | 5 ms |
总结
可以看出异步框架的性能是同步框架的3倍多还不止,数据如此夸张的原因是同步框架的处理所有请求都是按照顺序执行的,当请求有阻塞时需要等待。而异步框架处理请求遇到阻塞可以转而处理别的请求,所以相同时间异步框架能够处理的请求数远高于同步。
了解了纯框架的并发能力之后,下一篇来看看接口中有IO任务的并发对比。
准备连载一系列关于python异步编程的文章。包括同异步框架性能对比、异步事情驱动原理等。首发微信公众号,欢迎关注第一时间阅读。

Python异步编程之web框架异步vs同步 无IO任务压测对比的更多相关文章
- python高级编程之 web静态服务器
返回固定数据 import socket def request_handler(new_client_socket): """ 响应客户端请求的核心函数 "& ...
- python异步编程之asyncio
python异步编程之asyncio 前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率, ...
- 异步编程之Promise(3):拓展进阶
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 异步编程之Promise(2):探究原理
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 200行自定义异步非阻塞Web框架
Python的Web框架中Tornado以异步非阻塞而闻名.本篇将使用200行代码完成一个微型异步非阻塞Web框架:Snow. 一.源码 本文基于非阻塞的Socket以及IO多路复用从而实现异步非阻塞 ...
- Tornado----自定义异步非阻塞Web框架:Snow
Python的Web框架中Tornado以异步非阻塞而闻名.本篇将使用200行代码完成一个微型异步非阻塞Web框架:Snow. 一.源码 本文基于非阻塞的Socket以及IO多路复用从而实现异步非阻塞 ...
- 150行代码搭建异步非阻塞Web框架
最近看Tornado源码给了我不少启发,心血来潮决定自己试着只用python标准库来实现一个异步非阻塞web框架.花了点时间感觉还可以,一百多行的代码已经可以撑起一个极简框架了. 一.准备工作 需要的 ...
- 异步编程之Generator(1)——领略魅力
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- (翻译)异步编程之Promise(1):初见魅力
原文:https://www.promisejs.org/ by Forbes Lindesay 异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2) ...
- net异步编程之await
net异步编程之await 初探asp.net异步编程之await 终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await ...
随机推荐
- Android studio 安装过程中SDK的环境配置问题
SDK的环境配置问题 在之前的某一篇中,我也提到过在Ecplise里面的SDK的环境配置,二者确实不太一样! 一.系统环境变量新增一个 变量名为:ANDROID_HOME 变量值为:浏览到下载SDK的 ...
- 【Keil】浅学一下keil中的.sct文件
[Keil]浅学一下keil中的.sct文件 最近重新捣鼓了acfly的源码,有了新的有趣发现,当然,过程并不有趣. 起因 clone下来我去年提交的代码,编译 ...... 报错辣! linking ...
- RTE2021 回顾丨HDR 技术产品实践与探索
本文整理自 OPPO HDR 研发负责人熊磊,在 RTE2021 实时互联网大会上的演讲.他通过介绍 HDR 视频标准与生态.关键技术.发展方向三部分,分享了在移动端 HDR 视频的落地情况以及技术细 ...
- 声网Agora 教育 aPaaS 灵动课堂升级:UI与业务逻辑分离,界面、功能自定义更灵活
声网Agora 教育 aPaaS 产品灵动课堂现已升级至 v1.1.0 版本.声网Agora 灵动课堂可以帮助教育机构和开发者最快 15 分钟上线自有品牌.全功能的在线互动教学平台,节省 90% 开发 ...
- IDEA集成Gitee
配置Git 在设置里面点击Git,点击选择git安装目录下的bin目录下的git.exe,点击Test,出现版本号,证明配置成功. 配置码云 在设置里面按照下图步骤,即可成功配置码云 安装Gitee插 ...
- 罗技GHUB怎么写入板载内存
本文以自用罗技MX518复刻版鼠标作为例子,让大家怎么学会把logitech G HUB的设置写入鼠标板载内存,并且一键切换各组板载设置. 首先点击最下方的启用,让软件设置鼠标各项设定 启用软件的设定 ...
- MapReduce Shuffle源码解读
MapReduce Shuffle源码解读 相信很多小伙伴都背过shuffle的八股文,但一直不是很理解shuffle的过程,这次我通过源码来解读下shuffle过程,加深对shuffle的理解,但是 ...
- webpack踩坑日记
webpack 4.x 详细入门这是一个大佬的总结,但是我用webpack5重写该demo时,发现了几个有问题的地方1:CleanWebpackPlugin 应该这样: const { CleanWe ...
- freeswitch媒体协商的优先级方案
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 不同的媒体格式各有优缺点,实际环境中的应用要根据线路和客户的实际需求确定. 本文中介绍一种较为通用的媒体配置方案,可以适配大部分场景 ...
- 第三章3.1HTML技术与CSS技术
web中的html以及css: html(超文本标记语言:Hyper Text Markup Language):用于描述网页的一种语言: 通常其根标签使用html标签:使用尖括号表示:<htm ...