>백엔드 개발 >파이썬 튜토리얼 >FastAPI 엔드포인트에서 `concurrent.futures.ThreadPoolExecutor`를 사용하는 것이 위험합니까?

FastAPI 엔드포인트에서 `concurrent.futures.ThreadPoolExecutor`를 사용하는 것이 위험합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-12 07:20:02265검색

Is using a `concurrent.futures.ThreadPoolExecutor` in a FastAPI endpoint risky?

FastAPI 엔드포인트에서 Concurrent.futures.ThreadPoolExecutor를 사용하는 것이 위험합니까?

문제 설명:

제공된 테스트 코드에서는 ThreadPoolExecutor를 사용하여 여러 웹사이트에서 동시에 데이터를 검색합니다. FastAPI 엔드포인트에서 이 접근 방식을 사용하면 과도한 스레드 생성이 발생하고 리소스 부족 및 애플리케이션 충돌과 같은 잠재적인 문제가 발생할 수 있다는 점이 우려됩니다.

우려 사항 및 잠재적 문제점:

  • 스레드 고갈: 너무 많은 스레드를 생성하면 시스템의 스레드 풀이 고갈되어 스레드가 고갈되고 잠재적으로 애플리케이션이나 호스트가 충돌할 수 있습니다.
  • 리소스 경합: 스레드는 메모리 및 CPU와 같은 시스템 리소스를 두고 경쟁하므로 애플리케이션 속도가 느려지고 성능에 영향을 미칠 수 있습니다.
  • 동기화성: 멀티 스레드 환경에서 스레드 간 동기화를 관리하는 것은 복잡할 수 있으며 경쟁 조건이 발생할 가능성이 있습니다.

권장 솔루션: HTTPX 라이브러리 사용

ThreadPoolExecutor를 사용하는 대신 다음을 제공하는 HTTPX 라이브러리를 사용하는 것이 좋습니다. 비동기 API. HTTPX는 다음과 같은 여러 가지 장점을 제공합니다.

  • 비동기 작업: HTTPX는 비동기식으로 작동하므로 스레드 풀을 차단하지 않고 동시 요청을 효율적으로 처리할 수 있습니다.
  • 연결 풀 관리: 연결 풀을 자동으로 관리하여 연결 재사용을 보장하고 활성 연결 수를 제한합니다.
  • 세밀한 제어: HTTPX를 사용하면 연결 제한 및 활성 연결 수를 사용자 정의할 수 있습니다. 타임아웃을 통해 리소스 사용량을 정밀하게 제어할 수 있습니다.
  • FastAPI와의 단순화된 통합: FastAPI는 프레임워크에서 제공하는 비동기 지원을 활용하여 HTTPX와 원활하게 통합될 수 있습니다.

작업 예:

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

URLS = ['https://www.foxnews.com/',
        'https://edition.cnn.com/',
        'https://www.nbcnews.com/',
        'https://www.bbc.co.uk/',
        'https://www.reuters.com/']

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Customise settings
    limits = httpx.Limits(max_keepalive_connections=5, max_connections=10)
    timeout = httpx.Timeout(5.0, read=15.0)  # 5s timeout on all operations

    # Initialise the Client on startup and add it to the state
    async with httpx.AsyncClient(limits=limits, timeout=timeout) as client:
        yield {'client': client}
        # The Client closes on shutdown

app = FastAPI(lifespan=lifespan)

async def send(url, client):
    return await client.get(url)

@app.get('/')
async def main(request: Request):
    client = request.state.client
    tasks = [send(url, client) for url in URLS]
    responses = await asyncio.gather(*tasks)
    return [r.text[:50] for r in responses]  # For demo purposes, only return the first 50 chars of each response

이 코드 조각은 FastAPI와 함께 HTTPX를 사용하여 동시 요청을 비동기식으로 처리하고 스레드 소모 및 리소스 경합과 관련된 문제를 효과적으로 완화하는 방법을 보여줍니다.

위 내용은 FastAPI 엔드포인트에서 `concurrent.futures.ThreadPoolExecutor`를 사용하는 것이 위험합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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