fastapi與django異步的并發(fā)對(duì)比分析
概述
據(jù)說(shuō)fastapi是目前最快的異步框架,遂決定將其和django異步進(jìn)行并發(fā)比較。
先說(shuō)結(jié)果
fastapi的異步可以使整體運(yùn)行速度非常均衡,不會(huì)出現(xiàn)較大波動(dòng),但是django會(huì)出現(xiàn)大量的波動(dòng)問(wèn)題,部分訪問(wèn)速度很快,但是部分訪問(wèn)速度很慢,甚至超時(shí)。
個(gè)人感覺(jué)是因?yàn)閐jango的數(shù)據(jù)庫(kù)訪問(wèn)是同步的,但是fastapi我是用的異步數(shù)據(jù)庫(kù)訪問(wèn)。(django不支持異步數(shù)據(jù)庫(kù)訪問(wèn))
在長(zhǎng)時(shí)間并發(fā)情況下,fastapi的運(yùn)行狀態(tài)非常穩(wěn)定,但是django的運(yùn)行速度不行(另外我發(fā)現(xiàn)runserver運(yùn)行雖然慢,但是至少測(cè)試能成功,daphne并發(fā)量大了測(cè)試直接失敗。。)。(之后還會(huì)考慮pypy的測(cè)試和其他情況的)
測(cè)試環(huán)境
阿里云
服務(wù)器: 2 vCPU 4 GiB (I/O優(yōu)化) ecs.c5.large 4Mbps
數(shù)據(jù)庫(kù):rds.mysql.s1.small
服務(wù)器和數(shù)據(jù)庫(kù)都在華北三
測(cè)試指令:
ab -n 10000 -c 1000 http://127.0.0.1:8002/get_update_info
在更大并發(fā)和更長(zhǎng)時(shí)間的情況下daphne測(cè)試報(bào)錯(cuò),就算設(shè)置-k也報(bào)錯(cuò),但是fastapi能夠很穩(wěn)定的響應(yīng)。
測(cè)試結(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)文章
Django+Django-Celery+Celery的整合實(shí)戰(zhàn)
這篇文章主要介紹了Django+Django-Celery+Celery的整合實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Pycharm以root權(quán)限運(yùn)行腳本的方法
今天小編就為大家分享一篇Pycharm以root權(quán)限運(yùn)行腳本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python自然語(yǔ)言處理庫(kù)之NLTK庫(kù)初級(jí)教程
NLTK(Natural Language Toolkit)是一個(gè)Python庫(kù),用于實(shí)現(xiàn)自然語(yǔ)言處理(NLP)的許多任務(wù),NLTK包括一些有用的工具和資源,如文本語(yǔ)料庫(kù)、詞性標(biāo)注器、語(yǔ)法分析器等,在這篇初級(jí)教程中,我們將了解NLTK的基礎(chǔ)功能,需要的朋友可以參考下2023-08-08Python入門(mén)教程之變量與數(shù)據(jù)類(lèi)型
這篇文章主要介紹了Python入門(mén)教程之變量與數(shù)據(jù)類(lèi)型的相關(guān)知識(shí),文中給大家提到了變量的基本概念和數(shù)據(jù)類(lèi)型的相關(guān)實(shí)例代碼,需要的朋友可以參考下2022-02-02python數(shù)據(jù)分析之DateFrame數(shù)據(jù)排序和排名方式
這篇文章主要介紹了python數(shù)據(jù)分析之DateFrame數(shù)據(jù)排序和排名方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Python的numpy庫(kù)下的幾個(gè)小函數(shù)的用法(小結(jié))
這篇文章主要介紹了Python的numpy庫(kù)下的幾個(gè)小函數(shù)的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python3.4編程實(shí)現(xiàn)簡(jiǎn)單抓取爬蟲(chóng)功能示例
這篇文章主要介紹了Python3.4編程實(shí)現(xiàn)簡(jiǎn)單抓取爬蟲(chóng)功能,涉及Python3.4網(wǎng)頁(yè)抓取及正則解析相關(guān)操作技巧,需要的朋友可以參考下2017-09-09Python虛擬機(jī)之super超級(jí)魔法的使用和工作原理詳解
在本篇文章中,我們將深入探討Python中的super類(lèi)的使用和內(nèi)部工作原理,super類(lèi)作為Python虛擬機(jī)中強(qiáng)大的功能之一,super 可以說(shuō)是 Python 對(duì)象系統(tǒng)基石,他可以幫助我們更靈活地使用繼承和方法調(diào)用,需要的朋友可以參考下2023-10-10簡(jiǎn)單示例解析python爬蟲(chóng)IP的使用(小白篇)
這篇文章主要為大家通過(guò)簡(jiǎn)單示例解析python爬蟲(chóng)IP的使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06