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

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

测试基本信息

主题:比较异步框架和同步框架在文件IO操作的性能差异
python版本:python 3.8
压测工具:locust
web框架:同步:flask 异步:aiohttp、starlette
异步文件模块:aiofiles、anyio.Path
请求并发量: 模拟10个用户
服务器配置: Intel(R) i7-12700F
客户端配置:Intel(R) i7-8700 3.20GHz

flask 同步框架

flask是python中轻量级web框架,特点是灵活、轻量级、扩展性高。同时flask是一个同步框架,文件操作内容是在请求中打开一个文件demo.txt,读取文件内容,然后返回文件内容。

from flask import Flask, request  app = Flask(__name__)   @app.route('/file') def file():     with open("demo.txt") as f:         text = f.read()     return text   if __name__ == '__main__':     app.run(port=8090, host="0.0.0.0") 

压测结果

并发量:453
Python异步编程之web框架 异步vs同步 文件IO任务压测对比

aiohttp 异步框架

aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块,它既提供了服务端,又提供了客户端。由于python内置函数open不支持异步读写,所以选用异步文件读写速度最快的 aiofiles 模块,打开同一个demo.txt文件。

from aiohttp import web import aiofiles  routes = web.RouteTableDef()  @routes.get("/file") async def file(request):     async with aiofiles.open("demo.txt") as fp:         text = await fp.read()     return web.Response(text=text)  if __name__ == '__main__':     app = web.Application()     app.add_routes(routes)     web.run_app(app) 

压测结果

并发量:1490
Python异步编程之web框架 异步vs同步 文件IO任务压测对比

starlette 异步框架

starlette 是当下火热的异步框架fastapi依赖的唯二模块之一,主要用于异步请求的处理。anyio是starlette依赖的包,一个封装asyncio的高级异步库,自带异步io操作。

from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route from anyio import Path   async def file(request):     text = await Path('demo.txt').read_text()     return JSONResponse(text)   app = Starlette(debug=True, routes=[Route('/file', file),]) 

压测结果

并发量:1538
Python异步编程之web框架 异步vs同步 文件IO任务压测对比

对比

并发曲线图对比:
Python异步编程之web框架 异步vs同步 文件IO任务压测对比

参数对比:

框架 文件IO并发量 延迟 纯框架无IO并发量
flask 453 21 ms 463
aiohttp 1490 6 ms 1455
starlette 1538 6 ms 1539

总结

在文件读写方面,异步框架性能是同步框架的3倍左右。同一个框架相较于无IO并发时性能略有下降但并不是很多,这说明文件IO阻塞并严重。下一篇比较数据库IO的并发性能。

准备连载一系列关于python异步编程的文章。包括同异步框架性能对比、异步事情驱动原理等。首发微信公众号,欢迎关注第一时间阅读。
Python异步编程之web框架 异步vs同步 文件IO任务压测对比

发表评论

相关文章