淺談FastAPI到底用不用async問(wèn)題
FastAPI到底用不用async
FastAPI的很快,歸功于它的異步處理。
那我們用FastAPI框架時(shí),函數(shù)到底用不用async模式?
官方文檔:
https://fastapi.tiangolo.com/async/
做個(gè)實(shí)驗(yàn)
from fastapi import APIRouter import time import asyncio router = APIRouter() @router.get("/a") async def a(): time.sleep(1) return {"message": "異步模式,但是同步執(zhí)行sleep函數(shù),執(zhí)行過(guò)程是串行的"} @router.get("/b") async def b(): loop = asyncio.get_event_loop() await loop.run_in_executor(None, time.sleep, 1) return {"message": "線程池中運(yùn)行sleep函數(shù)"} @router.get("/c") async def c(): await asyncio.sleep(1) return {"message": "異步模式,且異步執(zhí)行sleep函數(shù)"} @router.get("/d") def d(): time.sleep(1) return {"message": "同步模式,但是FastAPI會(huì)放在線程池中運(yùn)行,所以很快"}
我們并發(fā)100個(gè)請(qǐng)求分別測(cè)試這4個(gè)接口。
結(jié)果
- /a接口:100秒
- /b接口:1秒
- /c接口:1秒
- /d接口:3秒
/a接口
- fastapi框架會(huì)將async函數(shù)會(huì)放到event loop中運(yùn)行。
- 雖然使用了async,但是函數(shù)內(nèi)部并沒(méi)有用到await,所以堵塞了。
- 執(zhí)行過(guò)程是串行的,所以總耗時(shí)100秒。
/b接口
- 利用asyncio異步IO獲取當(dāng)前的event loop。
- 然后將time.sleep(1)放到一個(gè)event loop中去運(yùn)行,函數(shù)內(nèi)部用到了await,所以無(wú)堵塞。
- 執(zhí)行過(guò)程是并行的,所以總耗時(shí)1秒。
/c接口
- 使用異步IO的sleep取代了普通的同步sleep。
- 原理與/b接口一致。
- 執(zhí)行過(guò)程是并行的,所以總耗時(shí)1秒。
/d接口
- 這個(gè)函數(shù)沒(méi)有async修飾,即一個(gè)普通函數(shù)。
- 但是FastAPI會(huì)將函數(shù)放到thread pool中執(zhí)行。
- 服務(wù)器是8核CPU,線程池的默認(rèn)配置是核心數(shù)*5=40。
- 服務(wù)器在第一秒和第二秒分別處理40個(gè)請(qǐng)求,第三秒處理20個(gè)請(qǐng)求。
- 所以100個(gè)并發(fā)總耗時(shí)3秒。
總結(jié)
官方說(shuō),無(wú)論你是否使用async,F(xiàn)astAPI都會(huì)采用異步的方式處理。
但是,如果你定義了async函數(shù),函數(shù)體卻是同步的調(diào)用(例:/a接口),將導(dǎo)致函數(shù)執(zhí)行過(guò)程變成串行。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python制作腳本幫女朋友搶購(gòu)清空購(gòu)物車(chē)
這篇文章主要介紹了Python制作的搶購(gòu)清空購(gòu)物車(chē)的腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08python中not、and和or的優(yōu)先級(jí)與詳細(xì)用法介紹
這篇文章主要給大家介紹了python中not、and和or的優(yōu)先級(jí)與詳細(xì)用法介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python super( )函數(shù)用法總結(jié)
今天給大家?guī)?lái)的知識(shí)是關(guān)于Python的相關(guān)知識(shí),文章圍繞著super( )函數(shù)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06pycharm進(jìn)行Git關(guān)聯(lián)和取消方式
這篇文章主要介紹了pycharm進(jìn)行Git關(guān)聯(lián)和取消方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python實(shí)現(xiàn)壓縮與解壓gzip大文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)壓縮與解壓gzip大文件的方法,分析了Python針對(duì)壓縮成gzip文件及解壓gzip文件的方法,并給出了相應(yīng)的封裝類(lèi),需要的朋友可以參考下2016-09-09