基于fastapi框架的異步解讀
使用fastapi框架開發(fā)web項(xiàng)目
1、為什么要用fastapi?
一直以來(lái)博主都是一直使用Django進(jìn)行開發(fā)的,最近公司開始使用fastapi進(jìn)行小項(xiàng)目的開發(fā)
通過(guò)博主對(duì)fastapi文檔的翻閱,發(fā)現(xiàn)fastapi最引人注意的就是他的異步支持。(當(dāng)然最新版的django也已經(jīng)支持異步請(qǐng)求)
2、什么是異步?
異步相對(duì)應(yīng)的就是同步
同步就是多件事排隊(duì)做
而異步就是多件事同時(shí)做
3、在django中是怎么實(shí)現(xiàn)異步的呢?
django采取的是多線程實(shí)現(xiàn)異步。
當(dāng)一個(gè)線程在做耗時(shí)操作的時(shí)候進(jìn)行線程間切換,給人一種多個(gè)線程在同時(shí)運(yùn)行的感覺(jué)。(當(dāng)然了,多核cpu確實(shí)是真正的多線程。)。
切換的同時(shí)不僅要重新獲取GIL鎖,還要重新加載和記住上下文,這些開銷對(duì)服務(wù)的性能是有一定影響的
4、fastapi中的異步
4.1 簡(jiǎn)單介紹一下協(xié)程的概念
相信大家都聽(tīng)說(shuō)過(guò)協(xié)程這個(gè)概念,
協(xié)程是在一個(gè)線程間進(jìn)行用戶級(jí)資源切換的概念
是不是很抽象?
我來(lái)解釋一下:
- 首先我們要了解線程屬于進(jìn)程,而協(xié)程屬于線程
- 寫過(guò)爬蟲的同學(xué)應(yīng)該了解過(guò)yield關(guān)鍵字,他就可以簡(jiǎn)單的作為一個(gè)協(xié)程來(lái)用
- 他可以構(gòu)造一個(gè)生成器,可能有些同學(xué)會(huì)把生成器和一個(gè)普通的可迭代對(duì)象混為一談(例如列表)
但是這又跟協(xié)程有什么關(guān)系呢?
是這樣的,當(dāng)用戶要取一個(gè)元素的時(shí)候,這個(gè)生成器相當(dāng)于被激活了,相當(dāng)于開始占用線程資源,生成一個(gè)元素,返回之后就讓出線程資源,直到用戶取下一個(gè)元素。
這就是協(xié)程的思想:它沒(méi)有線程間切換時(shí)資源的消耗大,并且完全由用戶控制
4.2 fastapi中的協(xié)程
fastapi由較為完善的異步處理方案(沒(méi)有非常完善)
他的基本語(yǔ)法與flask較為相似(雖然博主只寫過(guò)一點(diǎn)flask)
值得一提的是asgi異步網(wǎng)關(guān)協(xié)議,這個(gè)網(wǎng)關(guān)協(xié)議有完善的異步請(qǐng)求與websocket的支持。
他對(duì)async/await有很好的支持
對(duì)應(yīng)的web服務(wù)器是Uvicorn
我們可以使用sqlalchemy進(jìn)行異步數(shù)據(jù)庫(kù)查詢
其實(shí)一個(gè)web項(xiàng)目的性能瓶頸大部分還是在io方面(數(shù)據(jù)庫(kù)查詢,web請(qǐng)求,系統(tǒng)io)
例如有些數(shù)據(jù)庫(kù)查詢確實(shí)耗時(shí),我們又不想讓他阻塞當(dāng)前線程,我們就可以使用異步數(shù)據(jù)庫(kù)查詢
fastapi會(huì)在你注明異步數(shù)據(jù)庫(kù)查詢的地方讓出cpu資源,讓他去處理別的東西(比如另一個(gè)請(qǐng)求)
然后當(dāng)你的數(shù)據(jù)庫(kù)查詢結(jié)束返回之后,再次回到當(dāng)初讓出資源的地方,繼續(xù)往下執(zhí)行。
5、協(xié)程相較于線程的優(yōu)勢(shì)
協(xié)程可以記住上下文,從而避免在線程間切換中針對(duì)上下文切換的資源消耗和關(guān)于GIL鎖的資源消耗
6、協(xié)程的使用場(chǎng)景
我們可以把計(jì)算機(jī)的動(dòng)作大致分成兩種,一種是計(jì)算型,一種是io型,當(dāng)一個(gè)任務(wù)是計(jì)算型的時(shí)候,就意味著cpu要一直運(yùn)行,這個(gè)時(shí)候我們是沒(méi)法讓出cpu資源的,而當(dāng)一個(gè)任務(wù)是io型的,就相當(dāng)于cpu一直在休息,在等待,這個(gè)時(shí)候我們就可以讓出cpu的占用,讓他去處理別的任務(wù)
所以協(xié)程異步并不是所有場(chǎng)景都適用,他主要用于io場(chǎng)景。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python+OpenCV手勢(shì)檢測(cè)與識(shí)別Mediapipe基礎(chǔ)篇
網(wǎng)上搜到了一些關(guān)于手勢(shì)處理的實(shí)驗(yàn),我在這兒簡(jiǎn)單的實(shí)現(xiàn)一下,下面這篇文章主要給大家介紹了關(guān)于Python+OpenCV手勢(shì)檢測(cè)與識(shí)別Mediapipe基礎(chǔ)篇的相關(guān)資料,需要的朋友可以參考下2022-12-12
Python中函數(shù)帶括號(hào)和不帶括號(hào)的區(qū)別及說(shuō)明
這篇文章主要介紹了Python中函數(shù)帶括號(hào)和不帶括號(hào)的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Ubuntu手動(dòng)編譯源碼安裝Python的詳細(xì)過(guò)程
這篇文章主要介紹了Ubuntu手動(dòng)編譯源碼安裝Python的詳細(xì)過(guò)程,在python官網(wǎng)找到所需版本的python安裝包,下載到Ubuntu系統(tǒng)中,需要的朋友可以參考下2006-08-08
Python學(xué)習(xí)之不同數(shù)據(jù)類型間的轉(zhuǎn)換總結(jié)
類型轉(zhuǎn)換,就是將自身的數(shù)據(jù)類型變成新的數(shù)據(jù)類型,并擁有新的數(shù)據(jù)類型的所有功能的過(guò)程。本文將詳細(xì)為大家介紹如何在Python中實(shí)現(xiàn)不同數(shù)據(jù)類型的轉(zhuǎn)換,感興趣的可以了解一下2022-03-03

