FastAPI 엔드포인트에서 Concurrent.futures.ThreadPoolExecutor를 사용하는 것이 위험합니까?
문제 설명:
제공된 테스트 코드에서는 ThreadPoolExecutor를 사용하여 여러 웹사이트에서 동시에 데이터를 검색합니다. FastAPI 엔드포인트에서 이 접근 방식을 사용하면 과도한 스레드 생성이 발생하고 리소스 부족 및 애플리케이션 충돌과 같은 잠재적인 문제가 발생할 수 있다는 점이 우려됩니다.
우려 사항 및 잠재적 문제점:
권장 솔루션: HTTPX 라이브러리 사용
ThreadPoolExecutor를 사용하는 대신 다음을 제공하는 HTTPX 라이브러리를 사용하는 것이 좋습니다. 비동기 API. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!