Uvicorn/FastAPI での HTTP リクエストの作成
FastAPI と Uvicorn を使用して構築された HTTP エンドポイントを処理する場合、外部 API からデータをリクエストするのが一般的です。ただし、複数の同時リクエストを処理する場合、「role=SERVER および state=SEND_RESPONSE の場合、イベント タイプ ConnectionClosed を処理できません」などのエラーが発生することがあります。これは、デフォルトの HTTP クライアント ライブラリ「requests」が、このような同時環境で使用される場合に完全にスレッドセーフではないために発生します。
この問題を解決するには、httpx と呼ばれる代替 HTTP クライアント ライブラリを実装することを検討してください。 FastAPI 内のスレッド セーフティの問題を回避するのに役立つ非同期 API を提供します。以下の例は、FastAPI:
from fastapi import FastAPI, Request, BackgroundTask from fastapi.responses import StreamingResponse, Response from contextlib import asynccontextmanager import httpx @asynccontextmanager async def lifespan(app: FastAPI): async with httpx.AsyncClient() as client: yield {'client': client} app = FastAPI(lifespan=lifespan) @app.get('/') async def home(request: Request): client = request.state.client req = client.build_request('GET', 'https://www.example.com') r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose()))
httpx の非同期 API を利用すると、スレッドの安全性を維持しながら、FastAPI 内で HTTP リクエストをより効率的に処理できます。 Client オブジェクトの 'limits' キーワード引数を使用して、接続プール サイズをさらにカスタマイズできます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3