Maison >développement back-end >Tutoriel Python >L'utilisation d'un « concurrent.futures.ThreadPoolExecutor » dans un point de terminaison FastAPI est-elle risquée ?

L'utilisation d'un « concurrent.futures.ThreadPoolExecutor » dans un point de terminaison FastAPI est-elle risquée ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-12 07:20:02270parcourir

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

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 :

  • Épuisement des threads : Créer trop de threads peut épuiser le pool de threads du système, entraînant une famine des threads et potentiellement un crash de l'application ou de l'hôte.
  • Conflit de ressources : Les threads se disputent les ressources système, telles que la mémoire et le processeur, ce qui peut ralentir l'application et avoir un impact sur les performances.
  • Synchronisabilité : La gestion de la synchronisation entre les threads dans un environnement multithread peut être complexe et introduit un potentiel de conditions de concurrence.

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 :

  • Opération asynchrone : HTTPX fonctionne de manière asynchrone, permettant une gestion efficace des requêtes simultanées sans bloquer le pool de threads.
  • Gestion des pools de connexions : Il gère automatiquement les pools de connexions, garantissant la réutilisation des connexions et limitant le nombre de connexions actives.
  • Contrôle précis : HTTPX permet de personnaliser les limites de connexion et délais d'attente, offrant un contrôle précis sur l'utilisation des ressources.
  • Intégration simplifiée avec FastAPI : FastAPI peut être intégré à HTTPX de manière transparente, en utilisant la prise en charge asynchrone fournie par le framework.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn