>  기사  >  백엔드 개발  >  FastAPI 엔드포인트에서 ThreadPoolExecutor를 사용하는 것이 권장되지 않는 이유는 무엇입니까?

FastAPI 엔드포인트에서 ThreadPoolExecutor를 사용하는 것이 권장되지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-12 16:07:02263검색

Why is it not recommended to use ThreadPoolExecutor in FastAPI endpoints?

FastAPI 엔드포인트에서 ThreadPoolExecutor 사용 시 발생할 수 있는 위험

FastAPI 엔드포인트에서 Concurrent.futures.ThreadPoolExecutor를 사용하면 스레드 관리 및 잠재적 시스템 리소스에 대한 우려가 높아집니다. 피로. 주요 고려 사항은 다음과 같습니다.

스레드 확산 및 리소스 부족

ThreadPoolExecutor는 스레드 풀을 관리합니다. 각 끝점 호출은 잠재적으로 새로운 스레드를 생성하여 과도한 스레드 확산을 초래할 수 있습니다. 이는 특히 여러 요청이 동시에 발생할 때 시스템 리소스에 부담을 줄 수 있습니다.

HTTPX를 통한 향상된 접근 방식

이러한 위험을 완화하려면 대신 HTTPX 라이브러리를 사용하는 것이 좋습니다. HTTPX는 새 스레드를 생성하지 않고도 여러 요청을 효율적으로 처리하는 비동기 클라이언트를 제공합니다.

HTTPX 구성

HTTPX 클라이언트는 연결 수를 제어하고 살아있는 연결을 통해 애플리케이션의 필요에 맞게 동작을 조정할 수 있습니다.

FastAPI의 비동기 지원

FastAPI는 기본적으로 async 키워드를 사용하여 비동기 작업을 지원합니다. 이를 통해 이벤트 루프를 차단하지 않고 HTTP 요청을 비동기식으로 수행할 수 있습니다.

비동기 함수 및 HTTPX

FastAPI 엔드포인트에서 HTTPX를 비동기식으로 사용하려면 비동기 함수를 정의하세요. AsyncClient 인스턴스를 사용하여 HTTP 요청을 수행합니다.

HTTPX 클라이언트 관리

FastAPI의 수명 후크를 사용하여 HPX 클라이언트의 수명을 관리할 수 있습니다. 이렇게 하면 클라이언트가 시작 시 초기화되고 종료 시 닫혀 리소스 정리를 올바르게 처리할 수 있습니다.

스트리밍 응답

전체 응답 본문을 메모리로 읽지 않으려면 다음을 고려하세요. HTTPX 및 FastAPI의 StreamingResponse 클래스에서 스트리밍 응답을 사용합니다.

예제 코드

다음은 HTTPX를 사용하고 스레드 관리를 최적화하는 FastAPI 엔드포인트의 예입니다.

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager
import httpx
import asyncio

async def lifespan(app: FastAPI):
    # HTTPX client settings
    limits = httpx.Limits(max_keepalive_connections=5, max_connections=10)
    timeout = httpx.Timeout(5.0, read=15.0)

    # Initialize the HTTPX client
    async with httpx.AsyncClient(limits=limits, timeout=timeout) as client:
        yield {'client': client}

app = FastAPI(lifespan=lifespan)

@asynccontextmanager
async def send(client):
    req = client.build_request('GET', URL)
    yield await client.send(req, stream=True)

@app.get('/')
async def main(request: Request):
    client = request.state.client

    # Make HTTPX requests in a loop
    responses = [await send(client) for _ in range(5)]
    # Use a streaming response to return the first 50 chars of each response
    return StreamingResponse(iter_response(responses))

위 내용은 FastAPI 엔드포인트에서 ThreadPoolExecutor를 사용하는 것이 권장되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.