首頁 >後端開發 >Python教學 >在 FastAPI 端點使用 `concurrent.futures.ThreadPoolExecutor` 有風險嗎?

在 FastAPI 端點使用 `concurrent.futures.ThreadPoolExecutor` 有風險嗎?

Patricia Arquette
Patricia Arquette原創
2024-11-12 07:20:02270瀏覽

Is using a `concurrent.futures.ThreadPoolExecutor` in a FastAPI endpoint risky?

在 FastAPI 端點使用 Concurrent.futures.ThreadPoolExecutor 有風險嗎?

問題陳述:

在提供的測試程式碼中,ThreadPoolExecutor 用於同時從多個網站擷取資料。令人擔憂的是,在 FastAPI 端點中使用此方法可能會導致過多的執行緒建立和資源匱乏和應用程式崩潰等潛在問題。

問題與潛在問題:

  • 執行緒耗盡:建立太多執行緒會耗盡系統的執行緒池,導致執行緒匱乏並可能導致應用程式或主機崩潰。
  • 資源爭用:執行緒會爭奪系統資源,例如記憶體和 CPU,這會降低應用程式的速度並影響效能。
  • 同步性:在多執行緒環境中管理執行緒之間的同步可能會很複雜,而且引入潛在的競爭條件。

建議解決方案:使用 HTTPX 函式庫

建議使用 HTTPX 函式庫,而不是使用 ThreadPoolExecutor,它提供了非同步 API。 HTTPX 提供了許多優點:

  • 非同步操作: HTTPX 非同步工作,可以在不阻塞執行緒池的情況下高效處理並發請求。
  • 連線池管理:它會自動管理連線池,確保連線被重複使用並限制活動連線的數量。
  • 細微控制:HTTPX允許自訂連線限制和逾時,提供對資源使用的精確控制。
  • 與 FastAPI 的簡化整合:FastAPI 可以利用框架提供的非同步支援與 HTTPX 無縫整合。

工作範例:

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager
import httpx
import asyncio

URLS = ['https://www.foxnews.com/',
        'https://edition.cnn.com/',
        'https://www.nbcnews.com/',
        'https://www.bbc.co.uk/',
        'https://www.reuters.com/']

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Customise settings
    limits = httpx.Limits(max_keepalive_connections=5, max_connections=10)
    timeout = httpx.Timeout(5.0, read=15.0)  # 5s timeout on all operations

    # Initialise the Client on startup and add it to the state
    async with httpx.AsyncClient(limits=limits, timeout=timeout) as client:
        yield {'client': client}
        # The Client closes on shutdown

app = FastAPI(lifespan=lifespan)

async def send(url, client):
    return await client.get(url)

@app.get('/')
async def main(request: Request):
    client = request.state.client
    tasks = [send(url, client) for url in URLS]
    responses = await asyncio.gather(*tasks)
    return [r.text[:50] for r in responses]  # For demo purposes, only return the first 50 chars of each response

此程式碼片段示範如何使用HTTPX 和FastAPI 來非同步處理並發請求,有效緩解與執行緒耗盡和資源爭用相關的問題。

以上是在 FastAPI 端點使用 `concurrent.futures.ThreadPoolExecutor` 有風險嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn