Maison  >  Article  >  développement back-end  >  HTTPX est-il une alternative plus sûre à ThreadPoolExecutor dans les points de terminaison FastAPI ?

HTTPX est-il une alternative plus sûre à ThreadPoolExecutor dans les points de terminaison FastAPI ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-15 10:43:03261parcourir

Is HTTPX a Safer Alternative to ThreadPoolExecutor in FastAPI Endpoints?

Préoccupations liées à l'utilisation simultanée de ThreadPoolExecutor dans les points de terminaison FastAPI

Problème :

Concurrent.futures. ThreadPoolExecutor est utilisé pour le traitement parallèle, mais son impact potentiel sur un point de terminaison FastAPI suscite des inquiétudes. Plus précisément, si plusieurs appels d'API déclenchent la création d'un trop grand nombre de threads, cela pourrait entraîner un épuisement des ressources et des plantages.

Solution :

Plutôt que de s'appuyer sur ThreadPoolExecutor, le La bibliothèque HTTPX présente une alternative plus sûre avec son API asynchrone. Grâce à HTTPX, vous pouvez créer un client et le réutiliser pour plusieurs requêtes. Pour effectuer des opérations asynchrones, un AsyncClient est recommandé.

Configuration HTTPX :

HTTPX permet de personnaliser la taille du pool de connexions et les paramètres de délai d'expiration. Par exemple :

limits = httpx.Limits(max_keepalive_connections=5, max_connections=10)
async with httpx.AsyncClient(limits=limits) as client:
    ...

Ajustez les limites et les valeurs de délai d'attente en fonction de vos besoins spécifiques.

Exécution de requêtes asynchrones :

Pour créer plusieurs requêtes asynchrones demandes, vous pouvez utiliser asyncio.gather(). Il attendra l'achèvement de chaque demande et renverra une liste de résultats dans le même ordre que les tâches fournies.

Gestion du cycle de vie :

Pour gérer les événements de durée de vie dans le Application FastAPI, pensez à utiliser la dépendance de durée de vie. Cela vous permet d'initialiser et de nettoyer les ressources, telles que le client HTTPX, lorsque l'application démarre et s'arrête.

Réponses en streaming :

Si vous devez éviter En chargeant des réponses entières en mémoire, envisagez d'utiliser les capacités de streaming de HTTPX et StreamingResponse de FastAPI. Cela vous permet de traiter de manière itérative des morceaux de données de réponse, offrant ainsi une meilleure évolutivité.

Exemple de code :

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):
    # Custom settings
    client = httpx.AsyncClient(...)
    yield {'client': client}
    await client.aclose()  # Close the client 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)
    # Process the responses as needed (e.g., extract data, modify content)

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