FastAPI エンドポイントで「concurrent.futures.ThreadPoolExecutor」を使用するのは危険ですか?

Patricia Arquette
リリース: 2024-11-12 07:20:02
オリジナル
221 人が閲覧しました

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

FastAPI エンドポイントで Concurrent.futures.ThreadPoolExecutor を使用するのは危険ですか?

問題ステートメント:

提供されたテスト コードでは、ThreadPoolExecutor複数の Web サイトから同時にデータを取得するために使用されます。懸念されるのは、FastAPI エンドポイントでこのアプローチを使用すると、過剰なスレッドが作成され、リソース枯渇やアプリケーションのクラッシュなどの潜在的な問題が発生する可能性があることです。

懸念事項と潜在的な落とし穴:

  • スレッドの枯渇: スレッドを作成しすぎると、システムのスレッドが枯渇する可能性があります
  • リソース競合: スレッドがメモリや CPU などのシステム リソースを求めて競合するため、アプリケーションの速度が低下し、パフォーマンスに影響を与える可能性があります。 .
  • 同期性: マルチスレッド環境でスレッド間の同期を管理すると、

推奨される解決策: HTTPX ライブラリの使用

ThreadPoolExecutor を使用する代わりに、HTTPX ライブラリを使用することをお勧めします。 、非同期 API を提供します。 HTTPX には多くの利点があります。

  • 非同期操作: HTTPX は非同期で動作し、スレッド プールをブロックすることなく同時リクエストを効率的に処理できます。
  • 接続プール管理: 接続プールを自動的に管理し、接続が確実に再利用され、接続が制限されるようにします。アクティブな接続の数。
  • きめ細かい制御: HTTPX により、接続制限とタイムアウトをカスタマイズでき、リソース使用量を正確に制御できます。
  • 統合の簡素化FastAPI を使用: FastAPI は、

作業例:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート