關(guān)于fastapi異步框架操作的理解
fastapi異步框架操作
FastAPI的異步操作是指在處理請(qǐng)求時(shí),使用異步代碼來(lái)實(shí)現(xiàn)請(qǐng)求的處理。這種異步操作可以提高Web應(yīng)用程序的性能和響應(yīng)速度。
異步操作使得Web應(yīng)用程序可以在等待其他資源(如數(shù)據(jù)庫(kù)或網(wǎng)絡(luò)請(qǐng)求)響應(yīng)時(shí)繼續(xù)處理其他請(qǐng)求,從而提高了Web應(yīng)用程序的并發(fā)處理能力。
在FastAPI中,可以通過(guò)async和await關(guān)鍵字來(lái)實(shí)現(xiàn)異步操作。
一些常見(jiàn)的使用異步操作的場(chǎng)景包括
- 數(shù)據(jù)庫(kù)操作:在某些情況下,數(shù)據(jù)庫(kù)操作可能會(huì)非常慢,如果使用同步代碼,在等待數(shù)據(jù)庫(kù)響應(yīng)時(shí),Web應(yīng)用程序的性能將會(huì)受到影響。使用異步操作可以在等待數(shù)據(jù)庫(kù)響應(yīng)時(shí)繼續(xù)處理其他請(qǐng)求,提高并發(fā)處理能力。
- 網(wǎng)絡(luò)請(qǐng)求:與數(shù)據(jù)庫(kù)請(qǐng)求一樣,通過(guò)異步操作向外部API或服務(wù)請(qǐng)求數(shù)據(jù),減少阻塞等待響應(yīng)的時(shí)間,從而提高性能。
- IO密集型任務(wù):例如讀取和寫(xiě)入大量數(shù)據(jù),可以使用異步操作在等待IO響應(yīng)時(shí)繼續(xù)處理其他任務(wù)。
需要注意的是,在使用異步操作時(shí),需要使用異步的庫(kù)和框架,函數(shù)的前面需要加上Async關(guān)鍵字,例如async def,使用await關(guān)鍵字等待結(jié)果。
FastAPI內(nèi)置了異步操作支持,因此可以非常方便地實(shí)現(xiàn)異步操作。
以下是一段使用async和await關(guān)鍵字的異步操作的示例
from fastapi import FastAPI from fastapi.responses import HTMLResponse import httpx app = FastAPI() @app.get("/", response_class=HTMLResponse) async def read_root(): async with httpx.AsyncClient() as client: response = await client.get("https://www.baidu.com/") return response.content
作用
- 當(dāng)請(qǐng)求到達(dá)對(duì)應(yīng)的路由時(shí)
- 通過(guò)異步操作使用httpx庫(kù)中的AsyncClient
- 向百度發(fā)起請(qǐng)求,獲取響應(yīng)內(nèi)容并返回
解釋
- 'async with’語(yǔ)句和await關(guān)鍵字是異步操作的核心。
- 'async with’可以理解成一個(gè)異步代碼塊,它與普通的’with’語(yǔ)句類(lèi)似,但是在異步代碼中使用。
- 在上述示例中,通過(guò)async with關(guān)鍵字創(chuàng)建一個(gè)異步的httpx.AsyncClient對(duì)象,用于發(fā)起異步的http請(qǐng)求。
- 當(dāng)發(fā)起請(qǐng)求時(shí),使用await關(guān)鍵字等待獲取到的響應(yīng)。
- 在等待響應(yīng)時(shí),其他請(qǐng)求可以繼續(xù)被處理,以提高并發(fā)處理的能力。
總之:
關(guān)鍵字await可以使程序進(jìn)入異步操作,執(zhí)行這個(gè)操作的時(shí)候,程序會(huì)把控制權(quán)交給事件循環(huán),等待異步操作的結(jié)果返回后,再回到協(xié)程中繼續(xù)執(zhí)行后面的代碼。
需要注意的是:
只有在異步函數(shù)內(nèi)部使用await關(guān)鍵字才能生效,而在同步函數(shù)內(nèi)部使用await是不可以的。
關(guān)鍵字await的作用就是等待異步操作的結(jié)果,不會(huì)阻塞主線程,可以讓程序在等待異步操作的過(guò)程中,繼續(xù)去執(zhí)行其他的任務(wù),提高了程序的并發(fā)能力。
在等待異步操作返回結(jié)果之前,程序可以繼續(xù)執(zhí)行其他任務(wù),不需要等待異步操作返回結(jié)果。
只有等到異步操作的結(jié)果返回后,程序才會(huì)繼續(xù)執(zhí)行后續(xù)的代碼。
在上述示例代碼中
當(dāng)使用await關(guān)鍵字等待httpx庫(kù)的get方法完成請(qǐng)求時(shí),程序不會(huì)一直阻塞等待請(qǐng)求返回,而是繼續(xù)去處理其他任務(wù),直到請(qǐng)求響應(yīng)成功返回,程序才會(huì)繼續(xù)執(zhí)行后續(xù)的代碼。這樣可以使得程序更加高效,更好的利用計(jì)算機(jī)的資源。
這段代碼使用了FastAPI框架中的異步特性來(lái)實(shí)現(xiàn)的。
FastAPI是一個(gè)基于Python的Web框架,可以用于編寫(xiě)高性能的Web應(yīng)用。
該框架在Python標(biāo)準(zhǔn)庫(kù)的asyncio庫(kù)的基礎(chǔ)上,提供了更加強(qiáng)大、高效、易用的異步編程支持。
顯然,這段代碼使用了FastAPI框架中的異步支持。
其中的StreamingResponse和async函數(shù)等關(guān)鍵字都是FastAPI提供的異步特性,用于處理異步請(qǐng)求與響應(yīng)、異步IO等任務(wù)。
通過(guò)這些異步特性,開(kāi)發(fā)者可以更簡(jiǎn)單、高效地編寫(xiě)異步應(yīng)用程序
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?第三方庫(kù)?openpyxl?的安裝過(guò)程
這篇文章主要介紹了Python?高效辦公第三方庫(kù)?openpyxl?的安裝,本文介紹了什么是庫(kù)及庫(kù)的分類(lèi),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12python多進(jìn)程使用函數(shù)封裝實(shí)例
這篇文章主要介紹了python多進(jìn)程使用函數(shù)封裝實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Matplotlib多子圖使用一個(gè)圖例的實(shí)現(xiàn)
多子圖是Matplotlib中的一個(gè)功能,可以在同一圖形中創(chuàng)建多個(gè)子圖,本文主要介紹了Matplotlib多子圖使用一個(gè)圖例的實(shí)現(xiàn),感興趣的可以了解一下2023-08-08python 解決flask uwsgi 獲取不到全局變量的問(wèn)題
今天小編就為大家分享一篇python 解決flask uwsgi 獲取不到全局變量的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python幾種常用功能實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了python幾種常用功能實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12python圖形工具turtle繪制國(guó)際象棋棋盤(pán)
這篇文章主要為大家詳細(xì)介紹了python圖形工具turtle繪制國(guó)際象棋棋盤(pán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05