首頁 > 後端開發 > Python教學 > 為什麼 FastAPI 串行執行 API 呼叫而不是並行執行?

為什麼 FastAPI 串行執行 API 呼叫而不是並行執行?

Susan Sarandon
發布: 2025-01-02 15:15:42
原創
217 人瀏覽過

Why Does FastAPI Execute API Calls Serially Instead of in Parallel?

FastAPI:為什麼API 呼叫是串列執行而不是並行執行

FastAPI 使用非同步定義端點(也稱為路徑操作函數)定義和定義。雖然概念上async def 可能建議並行化,但FastAPI 實際上以不同的方式處理這些函數:

使用async def 定義的端點:

  • 直接在事件循環中運行。
  • 只能從其他非同步函數調用,並且在執行非非同步操作之前必須暫停(等待),例如I/O。
  • 確保事件循環不被阻塞,並且其他任務可以並發執行。

使用def 定義的端點:

  • 運行不是直接在事件循環中運行,而是在外部的單獨執行緒中運行線程池。
  • 可以從非同步或非非同步函數呼叫。
  • 如果不暫停執行非非同步操作,可能會阻塞事件循環並阻止其他任務執行。
  • 在某些場景下提供效能最佳化。

影響並行化:

基於這種理解,讓我們檢查一下您的程式碼範例:

@app.get("/ping")
async def ping(request: Request):
    print("Hello")
    time.sleep(5) # This sleeps the event loop for 5 seconds
    print("bye")
    return {"ping": "pong!"}
登入後複製

在這裡種情況下,會發生以下情況:

  • 兩個請求to /ping 同時發送。
  • 非同步 defENDPOINT 直接在事件中執行
  • time.sleep(5) 呼叫將事件循環暫停 5 秒。
  • 在這5 秒內,第二個請求將排隊並且無法處理,因為事件循環被阻塞.
  • 事件循環在5 秒後恢復後,第二個請求是

因此,回應將依序列印:

Hello
bye
Hello
bye
登入後複製

要啟用並行化,像time.sleep() 這樣的非非同步操作不應該 用於非同步定義端點。相反,可以應用以下方法之一:

  • 使用 run_in_threadpool() 產生執行緒並在事件循環之外執行阻塞操作。
  • 使用loop.run_in_executor()或 asyncio.to_thread() 在單獨的執行緒或進程中執行阻塞操作。
  • 考慮使用ThreadPoolExecutor 或 ProcessPoolExecutor 用於在進程外執行計算密集型任務。

以上是為什麼 FastAPI 串行執行 API 呼叫而不是並行執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板