await
如果使用的第三方庫說明調用它們要通過 await
results = await some_library()
聲明路徑操作函數
@app.get('/') async def read_results(): results = await some_library() return results
await 只能在 async def 函數中使用
注意
- 如果正在使用與某些內容(數據庫、API、文件系統等)通信的第三方庫,並且不支持 await, (目前大多數數據庫庫都是這種情況)
- 路徑操作需要聲明為普通函數 def,例如
@app.get('/') def results(): results = some_library() return results
- 如果應用程序(以某種方式)不必與其他任何東西通信並等待它響應,可以使用 async def(就是異步函數啦)
- 如果不知道的話,使用普通 def
- 可以根據需要在路徑操作函數中混合使用 def 和 async def
- 無論如何,在上述任何一種情況下,FastAPI 仍然會異步工作並且非常快
- 但是按照上面的步驟,它將能夠做一些性能優化
路徑操作函數
當使用普通 def 而不是 async def 聲明路徑操作函數時,它在一個外部線程池中運行,然后等待,而不是直接調用(因為它會阻塞服務器)
依賴關系
- 這同樣適用於依賴項
- 如果依賴項是標准 def 函數而不是 async def,則它在外部線程池中運行
子依賴
- 可以有多個相互依賴的依賴項和子依賴項(作為函數定義的參數)
- 其中一些可能是用 async def 創建的,有些可能是用普通 def 創建的
- 使用普通 def 創建的那些將在外部線程池上調用,而不是被“等待”
比較概念性的東西,還是等實際使用時再補充代碼栗子吧