Maison > développement back-end > Tutoriel Python > Pourquoi mon application FastAPI traite-t-elle les demandes simultanées de manière séquentielle plutôt qu'en parallèle ?

Pourquoi mon application FastAPI traite-t-elle les demandes simultanées de manière séquentielle plutôt qu'en parallèle ?

Linda Hamilton
Libérer: 2025-01-01 01:12:09
original
618 Les gens l'ont consulté

Why Does My FastAPI Application Process Concurrent Requests Sequentially Instead of in Parallel?

FastAPI exécute les appels d'API en série plutôt qu'en parallèle

Énoncé du problème :

Bien que FastAPI fournisse des fonctionnalités parallèles, l'API les appels effectués simultanément via plusieurs onglets du navigateur sont traités séquentiellement plutôt qu'en parallèle. Ce comportement se produit lorsque les points de terminaison sont définis avec def plutôt qu'async def.

Analyse et solution :

FastAPI utilise un pool de threads externe pour gérer les points de terminaison définis avec def. Lorsqu'un tel point de terminaison reçoit une requête, FastAPI l'exécute dans un thread distinct du pool de threads. Cependant, une seule requête peut être traitée à la fois, ce qui entraîne un traitement séquentiel des requêtes plutôt qu'un véritable parallélisme.

En revanche, les points de terminaison définis avec async def s'exécutent directement dans la boucle d'événements principale, permettant un véritable traitement parallèle des requêtes. . En effet, les appels d'attente au sein des points de terminaison def asynchrones cèdent la place à d'autres tâches dans la boucle d'événements en attendant des opérations asynchrones.

Pour résoudre le problème, assurez-vous que les points de terminaison qui ne nécessitent pas de blocage des opérations liées aux E/S sont définis. avec async def pour tirer parti des capacités parallèles de FastAPI. Voici un exemple de point de terminaison pouvant s'exécuter en parallèle :

@app.get("/ping")
async def ping(request: Request):
    print("Hello")
    await asyncio.sleep(5)
    print("bye")
    return {"ping": "pong!"}
Copier après la connexion

Informations supplémentaires :

  • Opérations de blocage, telles que time.sleep(), dans les points de terminaison de définition asynchrones, l'intégralité du serveur sera bloquée, rendant inefficaces les avantages du traitement parallèle.
  • Tâches liées au processeur ou les opérations d'E/S bloquantes peuvent être exécutées dans des threads ou des processus séparés à l'aide de techniques telles que run_in_threadpool(), loop.run_in_executor(), ThreadPoolExecutor ou ProcessPoolExecutor.
  • L'augmentation du nombre de travailleurs (processus) peut améliorer la concurrence et traiter plus de requêtes simultanément.
  • Pour les calculs en arrière-plan lourds, pensez à utiliser des outils comme Celery ou AsyncIOScheduler de apscheduler.

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