ホームページ >バックエンド開発 >Python チュートリアル >httpx を使用して FastAPI/Uvicorn でダウンストリーム HTTP リクエストを効率的に処理する方法?

httpx を使用して FastAPI/Uvicorn でダウンストリーム HTTP リクエストを効率的に処理する方法?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-12 18:57:11648ブラウズ

How to Efficiently Handle Downstream HTTP Requests in FastAPI/Uvicorn Using httpx?

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

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