想要用 Python 搞個高性能的 Web 服務(wù)?別再折騰 Flask 了,,來試試 FastAPI 搭配 Uvicorn 吧,!一個是現(xiàn)代化的 Web 框架,一個是極速的異步服務(wù)器,,這組合簡直是開發(fā)者的夢想組合,!今天就帶大家深入了解 Uvicorn,這個讓 Python Web 應(yīng)用飛起來的神器,!??
什么是 Uvicorn,?
Uvicorn 是一個基于 asyncio
開發(fā)的超快 ASGI(Asynchronous Server Gateway Interface)服務(wù)器。它構(gòu)建在 uvloop
和 httptools
之上,,體積小巧,、效率極高。
Uvicorn 誕生是為了兩個目的:
- 使用
uvloop
和 httptools
打造一款極致性能的異步服務(wù)器,。 - 實現(xiàn)一個基于 ASGI 的最小化應(yīng)用接口,,支持 HTTP、WebSocket,、Pub/Sub 廣播等協(xié)議,,未來還可以拓展更多協(xié)議。
官方網(wǎng)站:https://www./
uvloop 和 httptools 是啥,?
- uvloop:用 Cython 實現(xiàn)的
asyncio
事件循環(huán),,比標(biāo)準(zhǔn)的 asyncio
快 2-4 倍,相當(dāng)于給 Python 換上了超跑引擎,。??? - httptools:Node.js HTTP 解析器的 Python 版本,,專門用來加速 HTTP 解析。
什么是 ASGI?
ASGI(Asynchronous Server Gateway Interface)是 Python Web 應(yīng)用的新標(biāo)準(zhǔn),,彌補(bǔ)了 WSGI 不支持異步的缺陷,。它支持 HTTP、HTTP2,、WebSocket 等協(xié)議,,讓 Python 在高并發(fā) Web 應(yīng)用中與 Node.js 和 Go 一較高下!
詳細(xì)協(xié)議文檔:ASGI 官方文檔 https://asgi./en/latest/specs/main.html
Uvicorn 的安裝和使用
安裝 Uvicorn
pip install uvicorn
寫一個簡單的應(yīng)用
新建一個 example.py
文件:
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!'
})
啟動服務(wù)器
uvicorn example:app --reload
--reload
開啟熱重載,,代碼改動自動生效(開發(fā)階段必備?。?/span>
腳本方式啟動
import uvicorn
async def app(scope, receive, send):
...
if __name__ == '__main__':
uvicorn.run('example:app', host='127.0.0.1', port=8000, log_level='info')
更多命令
Uvicorn 支持多種啟動命令,可通過以下方式查看:
uvicorn --help
常用命令參數(shù):
--host
:綁定主機(jī)地址(默認(rèn) 127.0.0.1)--port
:綁定端口(默認(rèn) 8000)--reload
:開啟熱重載(開發(fā)環(huán)境強(qiáng)烈推薦)--workers
:指定工作進(jìn)程數(shù)(生產(chǎn)環(huán)境推薦)--log-level
:設(shè)置日志級別(info,、debug,、warning)
配置和服務(wù)器實例化
更靈活的方式:
import uvicorn
async def app(scope, receive, send):
...
if __name__ == '__main__':
config = uvicorn.Config('main:app', port=5000, log_level='info')
server = uvicorn.Server(config)
server.run()
在已有的異步環(huán)境中運行:
import asyncio
import uvicorn
async def app(scope, receive, send):
...
async def main():
config = uvicorn.Config('main:app', port=5000, log_level='info')
server = uvicorn.Server(config)
await server.serve()
if __name__ == '__main__':
asyncio.run(main())
FastAPI + Uvicorn:最佳拍檔
結(jié)合 FastAPI 使用:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get('/')
async def root():
return {'message': 'Hello World'}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
為什么 FastAPI 默認(rèn)用 Uvicorn?
FastAPI 是一個現(xiàn)代,、極速的 Web 框架,,天生支持異步,性能炸裂,。而 Uvicorn 又是專為異步而生的服務(wù)器,。兩者組合:
- ?? 高性能:異步 I/O,,輕松應(yīng)對高并發(fā),。
- ?? 新特性:支持 WebSocket、HTTP2,。
簡直是天作之合,,誰用誰知道,!??
結(jié)語
Uvicorn 不只是一個服務(wù)器,更是 Python 異步 Web 開發(fā)的一把利器,。FastAPI + Uvicorn 讓你的 Web 項目速度飛起,,開發(fā)效率也跟著起飛!
趕緊試試吧,,寫點代碼,,跑起來,感受速度與激情吧,!??