目錄
- ASGI框架
- ASGI服務(wù)器
- FastAPI
- 總結(jié)
Asgi是異步通信服務(wù)規(guī)范??蛻舳税l(fā)起服務(wù)呼叫,但不等待結(jié)果。調(diào)用方立即繼續(xù)其工作,并不關(guān)心結(jié)果。如果調(diào)用方對結(jié)果感興趣,有一些機(jī)制可以讓其隨時(shí)被回調(diào)方法返回結(jié)果。
ASGI嘗試保持在一個(gè)簡單的應(yīng)用接口的前提下,提供允許數(shù)據(jù)能夠在任意的時(shí)候、被任意應(yīng)用進(jìn)程發(fā)送和接受的抽象。并且同樣描述了一個(gè)新的,兼容HTTP請求響應(yīng)以及WebSocket數(shù)據(jù)幀的序列格式。允許這些協(xié)議能通過網(wǎng)絡(luò)或本地socket進(jìn)行傳輸,以及讓不同的協(xié)議被分配到不同的進(jìn)程中。
#Asgi example
async def application(scope, receive, send):
event = await receive()
...
await send({"type": "websocket.send", ...})
ASGI框架
您可以使用 Uvicorn,Daphne 或 Hypercorn 運(yùn)行任何 ASGI 框架
對于小型服務(wù),您也可以直接編寫 ASGI 應(yīng)用程序。例如之前編寫的異步框架。
Python 中有以下幾個(gè)支持 ASGI 的異步框架
Starlette
Starlette 是一個(gè)輕量級的 ASGI 框架/工具包。它是構(gòu)建高性能異步服務(wù)的理想選擇,并且支持 HTTP 和 WebSockets。
Django Channels
ASGI 規(guī)范最初是設(shè)計(jì)就是用于 Django Channels 的。
Channels 與其他ASGI框架略有不同,它在線程框架后端上提供了異步前端。
同時(shí) Django Channels 支持 WebSocket,后臺任務(wù)和長期運(yùn)行的連接,而應(yīng)用程序代碼仍在標(biāo)準(zhǔn)線程上下文中運(yùn)行
Quart
Quart 是一個(gè)類似于 Flask 的 ASGI Web 框架。Quart 不僅與 Flask 相似,而且與 Flask API 兼容!
該框架的作者希望保留了Flask 的風(fēng)格,只是向其中添加異步、WebSocket 和 HTTP 2支持。
因此,你可以從 Flask 文檔中學(xué)習(xí) Quart 的用法,只需要記住 Quart 中的函數(shù)是異步的就行。
一個(gè)簡單的 Quart 服務(wù):
from quart import Quart
app = Quart(name)
@app.route('/')
async def hello():
return 'hello'app.run()
和 Flask 是不是很像,只是多了一個(gè)異步 async
由于 Quart 是從 Flask 中演進(jìn)過來的,因此 Flask 的所有功能均可用:路由,中間件,會話,模板,藍(lán)圖等
ASGI服務(wù)器
Uvicorn 是一個(gè)快速的 ASGI 服務(wù)器,Uvicorn 是基于 uvloop 和 httptools 構(gòu)建的,是 Python 異步生態(tài)中重要的一員。
Uvicorn 當(dāng)前支持 HTTP / 1.1 和 WebSockets,將來計(jì)劃支持HTTP / 2。
版本要求 Python 3.5 以上,Uvicorn 的安裝,
示例如下:
async def app(scope, receive, send):
assert scope['type'] == 'http'
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'content-type', b'text/plain'],
]
})
await send({
'type': 'http.response.body',
'body': b'Hello, world!',
})
運(yùn)行命令如下,
uvicorn demo:app
服務(wù)啟動之后,我們通過瀏覽器就能方位該服務(wù),默認(rèn)端口 8000
Daphne
Daphne 服務(wù)器是最早為 Django Channels 提供支持的 ASGI 服務(wù)器
Daphne 它在生產(chǎn)中廣泛運(yùn)行,并支持HTTP / 1.1,HTTP / 2和 WebSockets。
安裝和運(yùn)行的命令如下:
pip install daphne daphne app:App和 uvicorn 命令類似,app 是文件名稱,APP 是應(yīng)用程序
Hypercorn
Hypercorn 最初是框架 Quart 的一部分,然后被分離為獨(dú)立的 ASGI 服務(wù)器
同樣的,Hypercorn 支持 HTTP/1.1, HTTP/2, 以及 WebSockets.
安裝和運(yùn)行的命令如下:
pip install hypercorn hypercorn app:App
FastAPI
FastAPI 是一個(gè)基于 Starlette 和 Pydantic 的 API 框架,其靈感來自以前的 APISta 服務(wù)器版本
使用 Python 3.6+ 類型聲明編寫 API 函數(shù)參數(shù),并獲得自動數(shù)據(jù)轉(zhuǎn)換,數(shù)據(jù)驗(yàn)證。
FastApi 最主要的特點(diǎn)是快,非常高的性能,向 NodeJS 和 Go 看齊,現(xiàn)有最快的Python框架之一
同時(shí)它可以自動生成交互式 API 文檔 UI,編寫 API 接口后,你就可以使用符合標(biāo)準(zhǔn)的 UI 如 SwaggerUI,ReDoc 等來使用 API。
其特點(diǎn)如下:
- 快速:擁有非常高的性能,歸功于 Starlette 和 Pydantic;Starlette 用于路由匹配,Pydantic 用于數(shù)據(jù)驗(yàn)證
- 開發(fā)效率:功能開發(fā)效率提升 200% 到 300%
- 減少 bug:減少 40% 的因?yàn)殚_發(fā)者粗心導(dǎo)致的錯(cuò)誤
- 智能:內(nèi)部的類型注解非常完善,編輯器可處處自動補(bǔ)全
- 簡單:框架易于使用,文檔易于閱讀
- 簡短:使代碼重復(fù)最小化,通過不同的參數(shù)聲明實(shí)現(xiàn)豐富的功能
- 健壯:可以編寫出線上使用的代碼,并且會自動生成交互式文檔
- 標(biāo)準(zhǔn)化:兼容 API 相關(guān)開放標(biāo)準(zhǔn)
- 它使用了 Python 的類型注解
示例如下:
先安裝依賴的庫
pip install fastapi
pip install uvicorn
import uvicorn
from fastapi import FastAPI
# 類似于 app = Flask(__name__)
app = FastAPI()
# 綁定路由和視圖函數(shù)
@app.get("/")
async def root():
return {"message": "Hi juejin"}
# 在 Windows 中必須加上 if __name__ == "__main__",否則會拋出 RuntimeError: This event loop is already running
if __name__ == '__main__':
# 啟動服務(wù),因?yàn)槲覀冞@個(gè)文件叫做 main.py,所以需要啟動 main.py 里面的 app
# 第一個(gè)參數(shù) "main:app" 就表示這個(gè)含義,然后是 host 和 port 表示監(jiān)聽的 ip 和端口
uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True, debug=True)
FastAPI 的幾大功能:類型檢查、自動 swagger UI、支持 asyncio、強(qiáng)大的依賴注入系統(tǒng)
總結(jié)
性能提升注: 以下針對生產(chǎn)環(huán)境的大型項(xiàng)目而言fastapi利用異步和輕量級的特點(diǎn),大大提升了性能。但異步應(yīng)用到實(shí)際中,并不是一件容易的事。fastapi的異步不算難寫,邏輯不復(fù)雜的話,閉著眼睛加幾個(gè)await很簡單。但如果涉及到復(fù)雜系統(tǒng)。一處異步,處處異步。到底要不要用可能就見仁見智了。輕量級同時(shí)也代表著和flask一樣,很多東西需要自己diy。而不是像django一樣一站式解決。所以fastapi可能逐漸接過flask的位置,但還是難以對django發(fā)起挑戰(zhàn)。最重要的一點(diǎn)還是,選了python作為后端??赡艽蛞婚_始就不是對性能有多敏感。而是看中python的開發(fā)效率和生態(tài)。如果從兼顧開發(fā)效率+性能的角度出發(fā),那么fastapi極大程度上會遇到來自go的強(qiáng)力競爭。只有再兼顧上python現(xiàn)有生態(tài),fastapi才會有很大的優(yōu)勢。我們可以假想一個(gè)現(xiàn)有python項(xiàng)目,遇到了性能瓶頸,但不想脫離python的環(huán)境,或者不想承受更換語言的成本。那么fastapi是個(gè)很好的未來。
API文檔、類型檢測以及依賴注入fastapi完全擁抱了typing類型系統(tǒng),高度整合了openapi(swagger ui),正如他的名字一樣fastapi,從api開發(fā)的角度來說,無論是性能還是開發(fā)效率,它都足夠“fast”。為api文檔提供了非常多的支持。無需任何配置,后端只要把endpoint寫出來,一份詳盡的api文檔就會自動生成。對于小型項(xiàng)目來說絕對是巨大優(yōu)勢。類型檢測和依賴注入是api文檔的基石 ,它們重點(diǎn)在于圍繞框架的“感知力”。inspect抓endpoint的參數(shù),明確的知道每個(gè)api接口需要什么,返回什么。這會讓你感覺這個(gè)框架真的很有靈性。對于這方面我個(gè)人絕對是贊不絕口的。
簡單與簡潔會用flask就會fastapi,fastapi的學(xué)習(xí)曲線十分平滑。從下至上有很多值得學(xué)習(xí)參透的。非常建議有空的同學(xué)過一遍starlette,uvicorn,fastapi的源碼。加起來也沒有django多。
相關(guān)生態(tài)和社區(qū)還未成熟python的異步發(fā)展略為緩慢,僅僅fastapi還不能撐起一片天。例如現(xiàn)在還沒有完全可靠的異步orm。不少東西還需要自己造輪子。在小項(xiàng)目上,這可能影響不是很大。直接寫代碼可能比配置插件來的快。但將很大程度上影響它被采用到線上生產(chǎn)環(huán)境??偨Y(jié)你可以將fastapi看成新出爐的flask plus。如果你有采用flask的理由,那么你同樣有將來采用fastapi的理由。
到此這篇關(guān)于python異步的ASGI與Fast Api實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python異步的ASGI與Fast Api內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python多線程、異步+多進(jìn)程爬蟲實(shí)現(xiàn)代碼
- 在Python中使用異步Socket編程性能測試
- python如何實(shí)現(xiàn)異步調(diào)用函數(shù)執(zhí)行
- Python的Tornado框架實(shí)現(xiàn)異步非阻塞訪問數(shù)據(jù)庫的示例
- python使用multiprocessing模塊實(shí)現(xiàn)帶回調(diào)函數(shù)的異步調(diào)用方法
- python并發(fā)編程之多進(jìn)程、多線程、異步和協(xié)程詳解
- 跨平臺python異步回調(diào)機(jī)制實(shí)現(xiàn)和使用方法
- python并發(fā)和異步編程實(shí)例