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


    1|0前言


    在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对比


    并发曲线图对比:

    参数对比:

    框架 并发量 延迟
    flask 463 19 ms
    aiohttp 1455 6 ms
    starlette 1539 5 ms

    7|0总结


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

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


    __EOF__

    本文作者goldsunshine
    本文链接https://www.cnblogs.com/goldsunshine/p/17418468.html
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    Trino 387 JVM 配置详解
    Trainer--学习笔记
    力扣(226.112)补9.8
    简单的前端语言
    t-SNE——高维特征可视化分析
    集合转json json转集合
    【代码随想录】LC 209. 长度最小的子数组
    2.NVIDIA Deepstream开发指南中文版--自述文件
    请问swat输出的是有机氮、 有机磷、 硝态氮等,但目前只有总磷、总氮和氨氮的数据,该怎么率定呢?
    BUUCTF 乌镇峰会种图 1
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/17418468.html