Python, en tant que langage de programmation efficace et facile à apprendre, a attiré de plus en plus d'attention dans le domaine de la programmation côté serveur ces dernières années. Avec la croissance explosive du trafic des applications Internet, les serveurs doivent offrir une concurrence élevée et des performances élevées, et la programmation asynchrone est l'une des technologies clés pour atteindre cet objectif. Cet article utilisera l'analyse de cas pour discuter des méthodes de mise en œuvre et des solutions d'optimisation de la programmation asynchrone côté serveur Python, et fournira une aide et des références aux développeurs qui sont actuellement ou seront engagés dans la programmation serveur Python.
1. Qu'est-ce que la programmation asynchrone ?
La programmation asynchrone est un modèle de programmation dont l'idée principale est d'obtenir des applications réseau à haute concurrence et hautes performances grâce à des opérations d'E/S non bloquantes et à des mécanismes pilotés par les événements. Différent du modèle de programmation synchrone traditionnel, la programmation asynchrone ne bloque pas un seul thread en attente de la fin des opérations d'E/S, mais confie plutôt les opérations d'E/S à la boucle d'événements IO pour traitement. Lorsque l'opération IO est terminée, la boucle d'événements notifiera l'exécution de la fonction de rappel correspondante pour traiter les résultats. De cette manière, le programme peut effectuer d'autres tâches en attendant la fin de l'opération d'E/S, améliorant ainsi l'efficacité de l'ensemble de l'application.
Python fournit une variété de frameworks de programmation asynchrone, notamment asyncio et Tornado, etc. Ici, nous utiliserons asyncio comme exemple pour présenter les solutions d'implémentation et d'optimisation de la programmation asynchrone côté serveur Python.
2. Analyse de cas
Ci-dessous, nous utiliserons un cas simple mais pratique pour illustrer le processus de mise en œuvre et les précautions de la programmation asynchrone côté serveur Python. Le cas est un serveur HTTP capable de gérer les requêtes HTTP des clients et de renvoyer les réponses HTTP correspondantes.
Installez d'abord asyncio et aiohttp deux bibliothèques dépendantes.
pip install asyncio aiohttp
Vous trouverez ci-dessous le code complet du serveur HTTP. Ici, nous utilisons la bibliothèque asyncio intégrée de Python et la bibliothèque aiohttp tierce pour implémenter un serveur HTTP asynchrone. Le serveur peut utiliser des coroutines lors du traitement des requêtes HTTP, obtenant ainsi une concurrence élevée.
import asyncio from aiohttp import web async def handle(request): name = request.match_info.get('name', "Anonymous") text = "Hello, " + name return web.Response(text=text) async def init(loop): app = web.Application(loop=loop) app.router.add_route('GET', '/{name}', handle) srv = await loop.create_server(app.make_handler(), '0.0.0.0', 8080) print('Server started at http://0.0.0.0:8080...') return srv loop = asyncio.get_event_loop() loop.run_until_complete(init(loop)) loop.run_forever()
Dans le code ci-dessus, nous définissons un handle de fonction de traitement asynchrone, qui peut accepter une requête HTTP et renvoyer une réponse HTTP. La réponse HTTP renvoyée par la fonction handle contient un message de bienvenue et le nom du client. Différent des serveurs HTTP synchrones traditionnels, nous utilisons des coroutines fournies par la bibliothèque asyncio pour gérer les requêtes HTTP, obtenant ainsi une concurrence élevée et des performances élevées.
Nous avons créé une application Web asynchrone à l'aide du constructeur web.Application de la bibliothèque aiohttp. Ensuite, nous associons la route '/{name}' à la fonction handle.
Enfin, nous utilisons la fonction init du mécanisme de boucle d'événements fournie par la bibliothèque asyncio pour enregistrer l'application dans la boucle d'événements et démarrer le service HTTP sur le port 8080 local. Notez que la fonction asynchrone create_server introduite dans Python 3.7 est utilisée pour créer le serveur.
Dans la programmation asynchrone, le serveur n'est pas le seul endroit où les E/S asynchrones doivent être référencées. Tout comme lorsque nous utilisons un client HTTP asynchrone, le client peut également utiliser des coroutines pour gérer les E/S.
Ce qui suit est le code complet pour obtenir des données du serveur à l'aide d'un client HTTP asynchrone.
import asyncio import aiohttp async def main(): async with aiohttp.ClientSession() as session: async with session.get('http://localhost:8080/yingyonghu') as response: print(await response.text()) loop = asyncio.get_event_loop() loop.run_until_complete(main())
Dans le code ci-dessus, nous utilisons un client HTTP asynchrone pour obtenir les données du serveur HTTP au lieu d'utiliser le client HTTP synchrone traditionnel. La principale différence est que nous utilisons l'instruction with async au lieu de l'instruction with normale. Cela garantit que le client HTTP asynchrone est automatiquement fermé lorsque l'appel asynchrone est terminé ou qu'une exception se produit. Dans cet exemple, nous utilisons la classe ClientSession de la bibliothèque aiohttp pour créer de manière asynchrone une session client HTTP, puis utilisons la méthode get pour obtenir de manière asynchrone les données renvoyées par le serveur.
Enfin, nous utilisons la fonction principale du mécanisme de boucle d'événement fournie par la bibliothèque asyncio pour enregistrer le code asynchrone dans la boucle d'événement et exécuter la boucle d'événement.
Bien que la programmation asynchrone puisse atteindre une concurrence élevée et des performances élevées, elle apporte également certains défis et considérations d'optimisation. Vous trouverez ci-dessous quelques optimisations que vous pouvez utiliser pour améliorer les performances de votre serveur Python asynchrone.
(1) Utilisez un pool de threads pour les calculs gourmands en CPU
La programmation asynchrone est généralement utilisée pour gérer les travaux gourmands en E/S. Toutefois, si votre application doit effectuer des calculs gourmands en CPU, la programmation asynchrone n’est pas la solution optimale. Bien qu'il soit possible d'utiliser le multithreading pour implémenter une programmation asynchrone, cela réduira les performances. Par conséquent, nous pouvons utiliser des pools de threads pour optimiser les performances de nos applications, améliorant ainsi les performances lors de l'exécution de calculs gourmands en CPU.
(2) Réduire l'utilisation des opérations d'E/S bloquantes
Le blocage des opérations d'E/S est une limitation de la programmation asynchrone car il réduira la concurrence de l'ensemble de l'application. Par conséquent, nous devons minimiser le recours au blocage des opérations d’E/S afin que l’application puisse répondre plus rapidement aux demandes.
(3) Utilisez le limiteur de concurrence selon vos besoins
Le limiteur de concurrence peut contrôler le nombre de requêtes traitées simultanément. Si votre application gère un grand nombre de requêtes simultanément, des problèmes de performances peuvent survenir. Par conséquent, il est préférable d’activer le limiteur de concurrence à la demande pour contrôler le nombre de requêtes simultanées en cas de besoin.
3.Résumé
Le modèle de programmation asynchrone de Python peut aider les développeurs à mettre en œuvre facilement des applications réseau à haute concurrence et hautes performances. Dans cet article, nous prenons un serveur HTTP comme exemple pour présenter les méthodes et précautions de base de la programmation asynchrone Python, et proposons des solutions d'optimisation pour aider à améliorer les performances des applications. En résumé, le modèle de programmation asynchrone est un outil très puissant dans la programmation côté serveur Python et peut aider les développeurs à créer des applications Web plus efficaces, fiables et évolutives.
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!