FastAPI エンドポイントで Concurrent.futures.ThreadPoolExecutor を使用するのは危険ですか?
問題ステートメント:
提供されたテスト コードでは、ThreadPoolExecutor複数の Web サイトから同時にデータを取得するために使用されます。懸念されるのは、FastAPI エンドポイントでこのアプローチを使用すると、過剰なスレッドが作成され、リソース枯渇やアプリケーションのクラッシュなどの潜在的な問題が発生する可能性があることです。
懸念事項と潜在的な落とし穴:
推奨される解決策: HTTPX ライブラリの使用
ThreadPoolExecutor を使用する代わりに、HTTPX ライブラリを使用することをお勧めします。 、非同期 API を提供します。 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 中国語 Web サイトの他の関連記事を参照してください。