• 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异步编程的文章。包括同异步框架性能对比、异步事情驱动原理等。首发微信公众号,欢迎关注第一时间阅读。 

  • 相关阅读:
    一百七十二、Flume——Flume采集Kafka数据写入HDFS中(亲测有效、附截图)
    用IntelliJ远程打断点调试
    获取深度学习模型权重或者某一层特征图输出的方法:基于pytorch
    JSP知识点总结-DX的笔记
    分享20个最实用的 .NET 开源项目
    面向智慧文博的知识图谱构建综述
    优化查询(工作中)
    Linux知识点+命令
    怎么提取一个python文件中所有得函数名称
    实践数据湖iceberg 第三十八课 spark sql, Procedures语法进行数据治理(小文件合并,清理快照)
  • 原文地址:https://blog.csdn.net/2301_77550592/article/details/133236532