FastAPI(63)- Concurrency and async / await 併發、非同步/等待
阿新 • • 發佈:2021-10-09
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 建立的那些將在外部執行緒池上呼叫,而不是被“等待”
比較概念性的東西,還是等實際使用時再補充程式碼栗子吧