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 創建的那些將在外部線程池上調用,而不是被“等待”

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM