ホームページ >バックエンド開発 >Python チュートリアル >Uvicorn を使用して FastAPI で同時 HTTP リクエストを行う際の「ConnectionClosed」エラーを回避するにはどうすればよいですか?

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

DDD
DDDオリジナル
2024-12-12 21:59:15501ブラウズ

How Can I Avoid

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。