httpx を使用した FastAPI/Uvicorn でのダウンストリーム HTTP リクエストの作成
概要
外部 HTTP リクエストに依存する FastAPI/Uvicorn の API エンドポイント、これは非常に重要です同時実行のスレッドセーフな処理を保証します。この記事では、httpx ライブラリを使用してこの問題に対処するための推奨アプローチについて説明します。
httpx の使用
HTTPX は、HTTP リクエストで複数の同時 HTTP リクエストをサポートする非同期 API を提供します。共有クライアント。これにより、接続とヘッダーを再利用することでパフォーマンスが向上します。
FastAPI での httpx の実装
FastAPI で httpx を使用するには、その AsyncClient:
from fastapi import FastAPI from httpx import AsyncClient app = FastAPI() app.state.client = AsyncClient() @app.on_event("shutdown") async def shutdown_event(): await app.state.client.aclose()
この例では、共有クライアントが FastAPI の状態の一部として作成され、 endpoints.
非同期の例
次のエンドポイントは、非同期 HTTP リクエストを作成し、応答をクライアントにストリーミングして返します:
from fastapi import FastAPI, StreamingResponse, BackgroundTask @app.get("/") async def home(): client = app.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))
更新された例
非推奨を伴う起動イベントとシャットダウン イベントの両方で、ライフスパン ハンドラーを使用できるようになりました。
from fastapi import FastAPI, Request, lifespan from starlette.background import BackgroundTask from httpx import AsyncClient, Request @lifespan.on_event("startup") async def startup_handler(app: FastAPI): app.state.client = AsyncClient() @lifespan.on_event("shutdown") async def shutdown_handler(): await app.state.client.aclose() @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))
応答コンテンツの読み取り
サーバー側で応答コンテンツを読み取る必要がある場合クライアントに送信する前に、ジェネレーター:
def gen(): async for chunk in r.aiter_raw(): yield chunk await r.aclose() return StreamingResponse(gen())
結論
httpx とその共有非同期クライアントを活用することで、FastAPI/Uvicorn 内でダウンストリーム HTTP リクエストを効率的に処理し、スレッドの安全性とパフォーマンスを確保できます。マルチスレッド環境での最適化。
以上がhttpx を使用して FastAPI/Uvicorn でダウンストリーム HTTP リクエストを効率的に処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。