Maison >développement back-end >Tutoriel Python >Concurrent ou parallèle : comment FastAPI gère-t-il les requêtes ?

Concurrent ou parallèle : comment FastAPI gère-t-il les requêtes ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 20:35:10135parcourir

Concurrent vs. Parallel: How Does FastAPI Handle Requests?

Requêtes simultanées ou parallèles dans FastAPI

Dans FastAPI, il existe une idée fausse courante sur la raison pour laquelle les points de terminaison de définition asynchrone n'exécutent pas toujours les requêtes dans parallèle. Ce comportement n'est pas dû à la conception de FastAPI, mais plutôt à la façon dont FastAPI utilise la programmation asynchrone.

Lors de l'utilisation de points de terminaison def, FastAPI les exécute de manière synchrone dans des threads séparés, permettant la concurrence. Cependant, les points de terminaison de définition asynchrone s'exécutent généralement directement dans la boucle d'événements, garantissant à la fois la concurrence et le parallélisme lorsque le code interagit avec les opérations d'E/S asynchrones.

Code synchrone ou asynchrone dans FastAPI

FastAPI prend en charge le code asynchrone via async def, ce qui permet de retransmettre le contrôle à la boucle d'événements à l'aide de wait. Cette fonctionnalité permet des opérations non bloquantes, telles que l'attente de données d'un client ou d'une réponse de base de données. Cependant, si une tâche synchrone, comme time.sleep(), est utilisée dans un point de terminaison def asynchrone, elle bloque la boucle d'événements et finalement le serveur, ce qui entraîne un traitement séquentiel des requêtes.

Pool de threads externe

Pour garantir que les tâches bloquantes n'entravent pas la boucle d'événements, FastAPI utilise un pool de threads externe, qui exécute les tâches définies avec def sur des threads séparés et les attend avant de reprendre l'exécution de la boucle d'événements. Cette approche permet d'obtenir la concurrence pour les points de terminaison def, même s'il ne s'agit pas d'une véritable parallélisation.

Bonnes pratiques

  • Utilisez async def pour les points de terminaison qui nécessitent l'attente d'opérations asynchrones.
  • Utilisez def pour les points de terminaison qui n'interagissent pas avec les E/S non bloquantes ou qui contiennent réponses simples.
  • Utilisez la fonction run_in_threadpool() de Starlette pour exécuter des tâches de blocage dans un thread séparé pour les points de terminaison de définition asynchrones.
  • Explorez à l'aide de méthodes asyncio comme loop.run_in_executor(), qui offre plus de flexibilité pour exécuter des tâches synchrones de manière asynchrone.
  • Envisagez d'utiliser des outils externes comme Celery ou AsyncIOScheduler pour les calculs lourds en arrière-plan.

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