国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

這篇具有很好參考價值的文章主要介紹了Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

測試基本信息

主題:比較異步框架和同步框架在數(shù)據(jù)庫IO操作的性能差異
python版本:python 3.8
數(shù)據(jù)庫:mysql 8.0.27 (docker部署)
壓測工具:locust
web框架:同步:flask 異步:starlette
請求并發(fā)量: 模擬10個用戶
服務(wù)器配置: Intel(R) i7-12700F
客戶端配置:Intel(R) i7-8700 3.20GHz

flask 同步框架

python中操作數(shù)據(jù)庫通常使用ORM框架完成。flask 使用的ORM框架是大名鼎鼎的sqlalchemy,該框架是所有ORM框架中生態(tài)最完善的,但是sqlalchemy對異步的支持并不算友好,目前支持原生SQL操作。
定義表結(jié)構(gòu)

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String

DB_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/test"
engine = create_engine(DB_URI)
Base = declarative_base(engine)  # SQLORM基類

class Student(Base):
    __tablename__ = 'student'  # 表名
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))


Base.metadata.create_all()  # 將模型映射到數(shù)據(jù)庫中

api接口

from flask import Flask, request
from sqlalchemy.orm import sessionmaker
from model import Student, engine, Base


app = Flask(__name__)


@app.route('/users')
def list_all():
    session = sessionmaker(engine)()  # 構(gòu)建session對象
    students = session.query(Student).all()
    res = [stu.name for stu in students]
    session.close()
    return res

@app.route("/user", methods=["POST"])
def create():
    session = sessionmaker(engine)()  # 構(gòu)建session對象
    student = Student(name='Tony')  # 創(chuàng)建一個student對象
    session.add(student)  # 添加到session
    session.commit()  # 提交到數(shù)據(jù)庫
    session.close()
    return {"res":"success"}

if __name__ == '__main__':
    app.run(port=8090, host="0.0.0.0")

接口調(diào)用

post請求
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

get 請求:
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

壓測結(jié)果

并發(fā)量:225
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

starlette 異步框架

starlette 異步框架配套使用的ORM框架是 tortoise-orm。tortoise-orm 是一款方便、易用、可靠的異步ORM框架,文檔:https://tortoise.github.io/
安裝數(shù)據(jù)庫

pip install tortoise-orm
pip install aiomysql

定義表結(jié)構(gòu)

from tortoise import fields, models


class Users(models.Model):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=20)

    def __str__(self) -> str:
        return f"User {self.id}: {self.username}"

api接口

from model import Users
from starlette.applications import Starlette
from tortoise.contrib.starlette import register_tortoise
from starlette.requests import Request
from starlette.responses import JSONResponse
from uvicorn.main import run


app = Starlette()

# 查詢記錄
@app.route("/user", methods=["GET"])
async def list_all(_: Request):
    users = await Users.all()
    return JSONResponse({"users": [str(user) for user in users]})

# 創(chuàng)建記錄
@app.route("/user", methods=["POST"])
async def create(request: Request):
    body = await request.json
    username = body.get("user_name")
    user = await Users.create(username=username)
    return JSONResponse({"ret":"success"})

# 表遷移
register_tortoise(app, db_url="mysql://root:123456@127.0.0.1:3306/test", modules={"models": ["model"]}, generate_schemas=True)

if __name__ == "__main__":
    run(app, host="0.0.0.0")

接口調(diào)用

post請求創(chuàng)建一個用戶
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

get請求
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

壓測結(jié)果

并發(fā)量:1496
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

性能對比

并發(fā)曲線圖對比:
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比

參數(shù)對比:

框架 數(shù)據(jù)庫IO 延遲 純框架無IO 文件IO
fastapi 225 47 ms 463 453
starlette 1496 6 ms 1539 1538

總結(jié)

在數(shù)據(jù)庫讀寫方面,異步框架性能是同步框架的6倍,可以看出同步框架在數(shù)據(jù)庫讀寫頻繁時性能下降明顯,幾乎是無IO讀寫的一半,而異步框架在有數(shù)據(jù)庫IO的情況下并發(fā)幾乎保持不變。主要原因是在當(dāng)前簡單的場景下數(shù)據(jù)庫讀操作耗時少而連接釋放耗時較多,異步編程非阻塞模型不等待,所以數(shù)據(jù)庫連接釋放耗時并不阻塞異步框架。下一篇比較redis IO的并發(fā)性能。

連載一系列關(guān)于python異步編程的文章。包括同異步框架性能對比、異步事情驅(qū)動原理等。首發(fā)微信公眾號,歡迎關(guān)注第一時間閱讀。
Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比文章來源地址http://www.zghlxwxcb.cn/news/detail-475412.html

到了這里,關(guān)于Python異步編程之web框架 異步vs同步 數(shù)據(jù)庫IO任務(wù)并發(fā)支持對比的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包