Maison > développement back-end > Tutoriel Python > 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
Libérer: 2024-11-15 10:43:03
original
368 Les gens l'ont consulté

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 dans une FastAPI suscite des inquiétudes. point final. 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:
    ...
Copier après la connexion

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, pensez à 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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal