1. 程式人生 > 其它 >FastAPI(63)- Concurrency and async / await 併發、非同步/等待

FastAPI(63)- Concurrency and async / await 併發、非同步/等待

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 建立的那些將在外部執行緒池上呼叫,而不是被“等待”

比較概念性的東西,還是等實際使用時再補充程式碼栗子吧