欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談FastAPI到底用不用async問(wèn)題

 更新時(shí)間:2024年06月21日 10:25:41   作者:程序員的戰(zhàn)歌  
這篇文章主要介紹了FastAPI到底用不用async問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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中局部變量和全局變量舉例詳解

    Python中局部變量和全局變量舉例詳解

    這篇文章主要介紹了如何通過(guò)一個(gè)簡(jiǎn)單的Python代碼示例來(lái)解釋命名空間和作用域的概念,它詳細(xì)說(shuō)明了內(nèi)置名稱(chēng)、全局名稱(chēng)、局部名稱(chēng)以及它們之間的查找順序,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Python制作腳本幫女朋友搶購(gòu)清空購(gòu)物車(chē)

    Python制作腳本幫女朋友搶購(gòu)清空購(gòu)物車(chē)

    這篇文章主要介紹了Python制作的搶購(gòu)清空購(gòu)物車(chē)的腳本,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • python中not、and和or的優(yōu)先級(jí)與詳細(xì)用法介紹

    python中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-11
  • Python super( )函數(shù)用法總結(jié)

    Python super( )函數(shù)用法總結(jié)

    今天給大家?guī)?lái)的知識(shí)是關(guān)于Python的相關(guān)知識(shí),文章圍繞著super( )函數(shù)展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 深入淺析Python代碼規(guī)范性檢測(cè)

    深入淺析Python代碼規(guī)范性檢測(cè)

    這篇文章主要介紹了Python代碼規(guī)范性檢測(cè),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • pycharm進(jìn)行Git關(guān)聯(lián)和取消方式

    pycharm進(jìn)行Git關(guān)聯(lián)和取消方式

    這篇文章主要介紹了pycharm進(jìn)行Git關(guān)聯(lián)和取消方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 切換路徑在Jupyter里調(diào)用本地文件的操作

    切換路徑在Jupyter里調(diào)用本地文件的操作

    這篇文章主要介紹了切換路徑在Jupyter里調(diào)用本地文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python實(shí)現(xiàn)壓縮與解壓gzip大文件的方法

    Python實(shí)現(xiàn)壓縮與解壓gzip大文件的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)壓縮與解壓gzip大文件的方法,分析了Python針對(duì)壓縮成gzip文件及解壓gzip文件的方法,并給出了相應(yīng)的封裝類(lèi),需要的朋友可以參考下
    2016-09-09
  • django中使用原生sql語(yǔ)句的方法步驟

    django中使用原生sql語(yǔ)句的方法步驟

    這篇文章主要介紹了django中使用原生sql語(yǔ)句的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python腳本替換指定行實(shí)現(xiàn)步驟

    python腳本替換指定行實(shí)現(xiàn)步驟

    這篇文章主要介紹了 python腳本替換指定行實(shí)現(xiàn)步驟的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評(píng)論