• 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

    2|0flask 同步框架

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

    2|1压测结果

    并发量:453

    image

    3|0aiohttp 异步框架

    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)

    3|1压测结果

    并发量:1490

    image

    4|0starlette 异步框架

    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),])

    4|1压测结果

    并发量:1538

    image

    5|0对比

    并发曲线图对比:

    image

    参数对比:

    框架文件IO并发量延迟纯框架无IO并发量
    flask45321 ms463
    aiohttp14906 ms1455
    starlette15386 ms1539

    6|0总结

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

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

  • 相关阅读:
    java计算机毕业设计ssm+vue杂货网络销售及配送系统
    2022 年最受瞩目的新特性 CSS @layer 到底是个啥?
    Flink Data Source
    方案详解|AARRR+八角行为分析=用游戏化思维实现用户增长
    ThreadLocal:线程中的全局变量
    vue里使用虚拟列表处理element-ui的el-select选择器组件数据量大时卡顿问题
    nginx配置密码访问
    介绍几种常用的Oracle客户端工具
    网工方向基本常识(持续更新)
    GIS原理篇 地图投影
  • 原文地址:https://blog.csdn.net/2301_77550592/article/details/133236532