fastapi與django異步的併發對比

概述

據說fastapi是目前最快的異步框架,遂決定將其和django異步進行併發比較。
先說結果:fastapi的異步可以使整體運行速度非常均衡,不會出現較大波動,但是django會出現大量的波動問題,部分訪問速度很快,但是部分訪問速度很慢,甚至超時。
個人感覺是因爲django的數據庫訪問是同步的,但是fastapi我是用的異步數據庫訪問。(django不支持異步數據庫訪問)
在長時間併發情況下,fastapi的運行狀態非常穩定,但是django的運行速度不行(另外我發現runserver運行雖然慢,但是至少測試能成功,daphne併發量大了測試直接失敗。。)。(之後還會考慮pypy的測試和其他情況的)
測試環境:
阿里雲
服務器: 2 vCPU 4 GiB (I/O優化) ecs.c5.large 4Mbps
數據庫:rds.mysql.s1.small
服務器和數據庫都在華北三
測試指令:

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

在更大併發和更長時間的情況下daphne測試報錯,就算設置-k也報錯,但是fastapi能夠很穩定的響應。
測試結果:
在這裏插入圖片描述
在這裏插入圖片描述
示例代碼:

#fastapi
# -*- encoding: utf-8 -*-
"""
@File    : test2.py
@Time    : 2020/3/13 14:21
@Author  : chise
@Email   : [email protected]
@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="主要內容")

    # data = MDTextField(verbose_name="主要內容")
    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})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章