更新於 2024/04/16閱讀時間約 3 分鐘

【💊 Python的解憂錦囊 - FastAPI】Sharing State讓路由共享資訊

raw-image


當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢?

首先我們來看看官方的文件:

📄 https://www.starlette.io/applications/#storing-state-on-the-app-instance


其中有提到, 我們可以透過「state」來儲存額外的狀態資料, 大致上這樣儲存…

app = FastAPI(...)
app.state.$共享的資料

再來我們可以設計一個函數專門來取狀態內容, 此時的函數命名就可以更直白一點, 未來閱讀實惠更加容易的閱讀。

def get_api_shared_params(connection: HTTPConnection) -> APISharedParams:
"""取得API共享參數

我們的VAD模型或者GPU模型通常需要共用, 而在FastAPI中我們透過 [State狀態](<https://www.vidavolta.io/sharing-memory/>) 來保存與取用,
那麼這邊的函式主要是取得共用參數的部份, 但我們還需要初始化設定參數, 如下:

# Step 1: 設定初始化參數
請使用 [lifespan](<https://fastapi.tiangolo.com/advanced/events/>) 於初始化時進行設定, 實際案例請參考 [main.py](./main.py)

```python
@asynccontextmanager
async def lifespan(app: FastAPI):
api_shared_params ...

app.state.api_shared_params = api_shared_params
```

# Step 2: 各路由注入並取得共用參數
```python
async def xxx(websocket: WebSocket, api_shared_params: APISharedParams = Depends(get_api_shared_params)):
...
```
"""
return connection.app.state.api_shared_params

最後透過依賴注入設置於路由函數之中。

async def xxx(websocket: WebSocket, api_shared_params: APISharedParams = Depends(get_api_shared_params)):

Q&A

那我們要如何在FastAPI的初始時就設置這些共享參數呢?

我們可以藉由 lifespan 來管理整個app的生命週期, 詳細請參考「【💊 Python的解憂錦囊 - FastAPI】使用 lifespan 來共享資料與管理生命週期」。

結語

FastAPI真的是一個非常強大的API框架, 基本上我們需要的功能大部分都已經相當完善了, 我們只要照著標準的教學文件即可輕鬆上手, 接下來我們也會陸續的分享關於FastAPI的一些技巧與經驗, 歡迎持續關注我們的頻道, 也非常感謝大家的支持。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.