fastapi與django異步的并發(fā)對比分析
概述
據(jù)說fastapi是目前最快的異步框架,遂決定將其和django異步進(jìn)行并發(fā)比較。
先說結(jié)果
fastapi的異步可以使整體運(yùn)行速度非常均衡,不會出現(xiàn)較大波動(dòng),但是django會出現(xiàn)大量的波動(dòng)問題,部分訪問速度很快,但是部分訪問速度很慢,甚至超時(shí)。
個(gè)人感覺是因?yàn)閐jango的數(shù)據(jù)庫訪問是同步的,但是fastapi我是用的異步數(shù)據(jù)庫訪問。(django不支持異步數(shù)據(jù)庫訪問)
在長時(shí)間并發(fā)情況下,fastapi的運(yùn)行狀態(tài)非常穩(wěn)定,但是django的運(yùn)行速度不行(另外我發(fā)現(xiàn)runserver運(yùn)行雖然慢,但是至少測試能成功,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ā)和更長時(shí)間的情況下daphne測試報(bào)錯(cuò),就算設(shè)置-k也報(bào)錯(cuò),但是fastapi能夠很穩(wěn)定的響應(yīng)。
測試結(jié)果


示例代碼
#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})
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python Pandas分組聚合的實(shí)現(xiàn)方法
這篇文章主要介紹了Python Pandas分組聚合的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python閉包的兩個(gè)注意事項(xiàng)(推薦)
閉包就是根據(jù)不同的配置信息得到不同的結(jié)果。下面通過本文給大家分享Python閉包的兩個(gè)注意事項(xiàng),需要的朋友參考下2017-03-03
python 判斷三個(gè)數(shù)字中的最大值實(shí)例代碼
這篇文章主要介紹了python 判斷三個(gè)數(shù)字中的最大值,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07

