「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Uvicorn を使用して FastAPI で同時 HTTP リクエストを行う際の「ConnectionClosed」エラーを回避するにはどうすればよいですか?

Uvicorn を使用して FastAPI で同時 HTTP リクエストを行う際の「ConnectionClosed」エラーを回避するにはどうすればよいですか?

2024 年 12 月 21 日に公開
ブラウズ:244

How Can I Avoid

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