溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

fastapi與django異步的并發(fā)源碼對比分析

發(fā)布時間:2023-03-15 09:51:09 來源:億速云 閱讀:164 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“fastapi與django異步的并發(fā)源碼對比分析”,在日常操作中,相信很多人在fastapi與django異步的并發(fā)源碼對比分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”fastapi與django異步的并發(fā)源碼對比分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    概述

    據(jù)說fastapi是目前最快的異步框架,遂決定將其和django異步進行并發(fā)比較。

    先說結(jié)果

    fastapi的異步可以使整體運行速度非常均衡,不會出現(xiàn)較大波動,但是django會出現(xiàn)大量的波動問題,部分訪問速度很快,但是部分訪問速度很慢,甚至超時。

    個人感覺是因為django的數(shù)據(jù)庫訪問是同步的,但是fastapi我是用的異步數(shù)據(jù)庫訪問。(django不支持異步數(shù)據(jù)庫訪問)

    在長時間并發(fā)情況下,fastapi的運行狀態(tài)非常穩(wěn)定,但是django的運行速度不行(另外我發(fā)現(xiàn)runserver運行雖然慢,但是至少測試能成功,daphne并發(fā)量大了測試直接失敗。。)。(之后還會考慮pypy的測試和其他情況的)

    測試環(huán)境

    阿里云

    服務(wù)器: 2 vCPU 4 GiB (I/O優(yōu)化) ecs.c5.large 4Mbps

    數(shù)據(jù)庫:rds.mysql.s1.small

    服務(wù)器和數(shù)據(jù)庫都在華北三

    測試指令:

    ab -n 10000 -c 1000 http://127.0.0.1:8002/get_update_info

    在更大并發(fā)和更長時間的情況下daphne測試報錯,就算設(shè)置-k也報錯,但是fastapi能夠很穩(wěn)定的響應(yīng)。

    測試結(jié)果

    fastapi與django異步的并發(fā)源碼對比分析

    fastapi與django異步的并發(fā)源碼對比分析

    示例代碼

    #fastapi
    # -*- encoding: utf-8 -*-
    """
    @File    : test2.py
    @Time    : 2020/3/13 14:21
    @Author  : chise
    @Email   : chise123@live.com
    @Software: PyCharm
    @info    :
    """
    from typing import List
    
    import databases
    import sqlalchemy
    from fastapi import FastAPI
    from pydantic import BaseModel
    
    # SQLAlchemy specific code, as with any other app
    DATABASE_URL = "mysql+pymysql://......"
    # DATABASE_URL = "postgresql://user:password@postgresserver/db"
    
    database = databases.Database(DATABASE_URL)
    
    metadata = sqlalchemy.MetaData()
    
    notes = sqlalchemy.Table(
        "notes",
        metadata,
        sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True),
        sqlalchemy.Column("text", sqlalchemy.String),
        sqlalchemy.Column("completed", sqlalchemy.Boolean),
    )
    
    engine = sqlalchemy.create_engine(
        DATABASE_URL, connect_args={"check_same_thread": False}
    )
    
    app = FastAPI()
    
    
    @app.on_event("startup")
    async def startup():
        await database.connect()
    
    
    @app.on_event("shutdown")
    async def shutdown():
        await database.disconnect()
    
    
    class D(BaseModel):
        id: int
        info: str
        data: str
    
    
    @app.get('/get_update_info', response_model=D)
    async def get_update_info():
        return await database.fetch_one("SELECT * FROM `publicadmin_updateinfo` LIMIT 1 ;")
    
    
    if __name__ == "__main__":
        import uvicorn
    
        uvicorn.run(app,)

    django代碼如下

    class UpdateInfo(models.Model):
        info = models.TextField(verbose_name="更新日志")
        data = models.TextField(verbose_name="主要內(nèi)容")
    
        # data = MDTextField(verbose_name="主要內(nèi)容")
        class Meta:
            verbose_name = "公告欄"
            verbose_name_plural = verbose_name
    def get_update_info(request):
        """
        更新日志
        Args:
            request:
        Returns:
        """
        info: UpdateInfo = UpdateInfo.objects.first()
        return JsonResponse({"id": info.id, "msg": info.info, "main_info": info.data})

    到此,關(guān)于“fastapi與django異步的并發(fā)源碼對比分析”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI