【熱聞】Python異步編程之web框架 異步vs同步 Redis并發(fā)對(duì)比
發(fā)布時(shí)間:2023-06-16 09:34:14 文章來源:博客園
在RedisIO方面,異步框架的性能是同步框架的4.3倍左右,和文件IO、數(shù)據(jù)


【資料圖】

測試基本信息

主題:比較異步框架和同步框架在RedisIO操作的性能差異python版本:python 3.8數(shù)據(jù)庫:redis 5.0.7壓測工具:locustweb框架:同步:flask 異步:starlette請(qǐng)求并發(fā)量: 模擬10個(gè)用戶服務(wù)器配置: Intel(R) i7-12700F客戶端配置:Intel(R) i7-8700 3.20GHz

flask 同步框架

flask是python中輕量級(jí)web框架,特點(diǎn)是靈活、輕量級(jí)、擴(kuò)展性高。同時(shí)flask是一個(gè)同步框架,操作Redis使用的是官方最推薦的包redis-py。redis-py早期版本只支持同步模式,高版本中已經(jīng)支持異步模式。接口功能非常簡單,連接Redis從中讀取一個(gè)key,已經(jīng)提前寫入redis。

from flask import Flaskfrom redis import StrictRedisapp = Flask(__name__)@app.route("/user")def user_list():    redis_conn = StrictRedis(host="127.0.0.1", port=6379, decode_responses=True)    res = redis_conn.get("name")    return resif __name__ == "__main__":    app.run(port=8090, host="0.0.0.0")
壓測結(jié)果

并發(fā)量:342

starlette 異步框架

starlette 是當(dāng)下火熱的異步框架fastapi依賴的唯二模塊之一,主要用于異步請(qǐng)求的處理。redis-py 既支持同步模式又支持異步模式,所以在starlette這個(gè)異步框架中就使用其異步模式。

from starlette.applications import Starlettefrom starlette.responses import JSONResponsefrom starlette.routing import Routefrom uvicorn.main import runfrom redis.asyncio import StrictRedisasync def user(request):    redis_conn = StrictRedis(host="127.0.0.1", port=6379, decode_responses=True)    res = await redis_conn.get("name")    await redis_conn.close()    return JSONResponse(res)app = Starlette(debug=True, routes=[Route("/user", user),])if __name__ == "__main__":    run(app, host="0.0.0.0")
壓測結(jié)果

并發(fā)量:1361

對(duì)比

并發(fā)曲線圖對(duì)比:

參數(shù)對(duì)比:

框架Redis IO純框架無IO文件IO數(shù)據(jù)庫IO
flask315463453225
starlette1361153915381496
性能比(異步/同步)4.33.33.46.6
總結(jié)

在Redis IO方面,異步框架的性能是同步框架的4.3倍左右,和文件IO、數(shù)據(jù)庫IO大體一致。橫向和數(shù)據(jù)庫IO比較略有下降,多次測試確實(shí)如此,猜測和redis-py模塊的異步模式有關(guān)。本篇是對(duì)比系列最后一篇。從異步密切相關(guān)的IO任務(wù)對(duì)比中可以切實(shí)看出異步編程的并發(fā)量比較高,后續(xù)篇幅中將講解python中異步編程的原理和使用。

標(biāo)簽:

資訊播報(bào)

樂活HOT

娛樂LOVE

精彩推送