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

在python编程中,通过协程实现的异步编程号称能够提高IO密集型任务的并发量。本系列比较web服务器同步框架和异步框架的性能差异,包括无IO接口和常见IO操作,如文件、mysql、redis等。使用压测工具locust测试相同条件下两种编程模式能够处理请求的速度。

2|0测试基本信息

主题:单纯比较异步框架和同步框架的性能,无任何IO
python版本:python 3.8
压测工具:locust
web框架:同步:flask 异步:aiohttp、starlette
请求并发量: 模拟10个用户
服务器配置: Intel(R) i7-12700F
客户端配置:Intel(R) i7-8700 3.20GHz

3|0flask 同步框架

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")

3|1压测准备

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个模拟用户发送请求

3|2压测结果

并发量:463

4|0aiohttp 异步框架

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)

4|1压测结果

并发量:1455

5|0starlette 异步框架

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")

5|1压测结果

并发量:1539

6|0对比

并发曲线图对比:

参数对比:

框架并发量延迟
flask46319 ms
aiohttp14556 ms
starlette15395 ms

7|0总结

可以看出异步框架的性能是同步框架的3倍多还不止,数据如此夸张的原因是同步框架的处理所有请求都是按照顺序执行的,当请求有阻塞时需要等待。而异步框架处理请求遇到阻塞可以转而处理别的请求,所以相同时间异步框架能够处理的请求数远高于同步。
了解了纯框架的并发能力之后,下一篇来看看接口中有IO任务的并发对比。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值