ホームページ >バックエンド開発 >Python チュートリアル >Uvicorn を使用して FastAPI で同時 HTTP リクエストを行う際の「ConnectionClosed」エラーを回避するにはどうすればよいですか?
Uvicorn/FastAPI での HTTP リクエストの作成
FastAPI と Uvicorn を使用して構築された HTTP エンドポイントを処理する場合、外部 API からデータをリクエストするのが一般的です。ただし、複数の同時リクエストを処理する場合、「role=SERVER および state=SEND_RESPONSE の場合、イベント タイプ ConnectionClosed を処理できません」などのエラーが発生することがあります。これは、デフォルトの HTTP クライアント ライブラリ「requests」が、このような同時環境で使用される場合に完全にスレッドセーフではないために発生します。
この問題を解決するには、httpx と呼ばれる代替 HTTP クライアント ライブラリを実装することを検討してください。 FastAPI 内のスレッド セーフティの問題を回避するのに役立つ非同期 API を提供します。以下の例は、FastAPI で httpx を使用する方法を示しています。
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' キーワード引数を使用して、接続プール サイズをさらにカスタマイズできます。
以上がUvicorn を使用して FastAPI で同時 HTTP リクエストを行う際の「ConnectionClosed」エラーを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。