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

科技资讯 投稿 6800 0 评论

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

前言

测试基本信息

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

flask 同步框架

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

压测准备

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

压测结果

aiohttp 异步框架

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)

压测结果

并发量:1455

starlette 异步框架

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

压测结果

并发量:1539

对比

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

总结

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

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

赞同 (25) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽