Maison >développement back-end >Tutoriel Python >L'utilisation d'un « concurrent.futures.ThreadPoolExecutor » dans un point de terminaison FastAPI est-elle risquée ?
Est-il risqué d'utiliser un Concurrent.futures.ThreadPoolExecutor dans un point de terminaison FastAPI ?
Énoncé du problème :
Dans le code de test fourni, un ThreadPoolExecutor est utilisé pour récupérer simultanément les données de plusieurs sites Web. Le problème est que l'utilisation de cette approche dans un point de terminaison FastAPI pourrait entraîner une création excessive de threads et des problèmes potentiels tels que le manque de ressources et les plantages d'applications.
Préoccupations et problèmes potentiels :
Solution recommandée : utilisation de la bibliothèque HTTPX
Au lieu d'utiliser un ThreadPoolExecutor, il est conseillé d'utiliser la bibliothèque HTTPX, qui offre une API asynchrone. HTTPX offre un certain nombre d'avantages :
Exemple de travail :
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
Cet extrait de code démontre l'utilisation de HTTPX avec FastAPI pour gérer les requêtes simultanées de manière asynchrone, atténuant ainsi efficacement les problèmes associés à l'épuisement des threads et aux conflits de ressources.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!