httpx를 사용하여 FastAPI/Uvicorn에서 다운스트림 HTTP 요청 만들기
소개
외부 HTTP 요청에 의존하는 FastAPI/Uvicorn의 API 엔드포인트는 매우 중요합니다. 스레드로부터 안전한 동시성 처리를 보장합니다. 이 문서에서는 httpx 라이브러리를 사용하여 이 문제를 해결하기 위해 권장되는 접근 방식을 살펴봅니다.
httpx 사용
местоrequests에서 httpx는 공유 클라이언트. 이렇게 하면 연결과 헤더를 재사용하여 성능이 향상됩니다.
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 상태의 일부로 공유 클라이언트가 생성되어 다음 사용자가 액세스할 수 있습니다. 엔드포인트.
비동기 예
다음 엔드포인트는 비동기 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!