Maison >développement back-end >Tutoriel Python >Comment FastAPI peut-il gérer l'exécution parallèle et éviter le blocage des opérations ?

Comment FastAPI peut-il gérer l'exécution parallèle et éviter le blocage des opérations ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-27 14:20:10298parcourir

How Can FastAPI Handle Parallel Execution and Avoid Blocking Operations?

FastAPI et exécution parallèle

Programmation asynchrone dans FastAPI

Par défaut, FastAPI utilise des modèles de programmation asynchrone, lui permettant de gérer plusieurs demandes simultanément. Plus précisément, il utilise des coroutines et la boucle d'événements pour exécuter les requêtes de manière efficace.

Fonctions Def vs. Async Def

Les fonctions définies comme def (synchrones) sont traitées dans un thread séparé au sein d’un pool de threads externe. Les fonctions définies comme async def (asynchrone) sont directement exécutées dans la boucle d'événements.

Exécution du code de blocage

Problème : Lorsqu'une opération de blocage est exécuté dans un point de terminaison de définition asynchrone, il peut bloquer la boucle d'événements et sérialiser la demande traitement.

Solution :

  1. Définir les points de terminaison avec def : Si le point de terminaison ne nécessite pas d'opérations asynchrones, déclarez-le avec un def pour éviter le blocage.
  2. Utilisez run_in_threadpool() : Pour bloquer les opérations au sein des points de terminaison de définition asynchrones, la fonction FastAPI run_in_threadpool() vous permet d'exécuter la tâche dans un thread distinct au sein du pool de threads pour éviter le blocage de la boucle d'événement.
  3. Utilisez asyncio.loop.run_in_executor() : Cette fonction fournit une alternative à run_in_threadpool() pour exécuter des tâches bloquantes de manière asynchrone.
  4. Utilisez un processus distinct (ProcessPoolExecutor) : Pour les calculs gourmands en CPU, il est recommandé d'exécuter la tâche dans un processus distinct pour maximiser la parallélisation.

Éviter l'épuisement du pool de threads

  • Utilisez le httpx bibliothèque avec asyncio.gather() pour exécuter plusieurs requêtes HTTP asynchrones en parallèle.
  • Employez plusieurs travailleurs FastAPI (uvicorn --workers) pour distribuer les requêtes sur plusieurs processus, chacun avec son propre pool de threads.
  • Envisagez d'utiliser des systèmes de mise en file d'attente de tâches externes comme Celery pour un arrière-plan lourd calculs.

Remarques supplémentaires :

  • Mise en cache du navigateur : Ouvrez les onglets de navigation privée ou utilisez une autre session de navigateur pour éviter le navigateur. effets de mise en cache sur les appels API.
  • Asynchrone E/S : Les clients HTTP asynchrones comme httpx et aiohttp offrent de meilleures performances que les clients synchrones comme les requêtes.

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