Python, en tant que langage de programmation interprété, dispose d'un support de bibliothèques très puissant, y compris diverses bibliothèques liées à la programmation réseau. Dans le domaine de la programmation serveur en Python, la programmation d'E/S asynchrones est une technologie très importante. Cet article présentera ce qu'est la programmation d'E/S asynchrones, pourquoi l'utilisation d'E/S asynchrones est plus efficace et présentera les techniques d'implémentation de la programmation d'E/S asynchrones en Python.
Qu'est-ce que la programmation d'E/S asynchrones ?
Dans la programmation d'E/S synchrone traditionnelle, le programme se bloque généralement pour attendre la fin d'une opération avant de passer à l'opération suivante. En raison de la lenteur de la transmission du réseau, une telle attente entraînera une efficacité d'exécution du programme extrêmement faible et les ressources informatiques ne pourront pas être pleinement utilisées.
La programmation d'E/S asynchrone est une méthode de programmation qui ne bloque plus et n'attend plus. Elle peut continuer à exécuter le code suivant en attendant la fin de l'opération d'E/S. Ceci est réalisé à l'aide d'un mécanisme de boucle d'événements asynchrone et d'opérations d'E/S non bloquantes.
Grâce à la programmation d'E/S asynchrone, plusieurs opérations d'E/S (telles que la lecture et l'écriture de fichiers, les requêtes réseau, etc.) peuvent être exécutées simultanément et attendre que toutes les opérations d'E/S soient terminées avant de passer à l'étape suivante. . Cela permet un traitement simultané efficace.
Pourquoi utiliser la programmation d'E/S asynchrones ?
Par rapport à la programmation d'E/S synchrone, la programmation d'E/S asynchrone présente des avantages très évidents :
Conseils pour implémenter la programmation d'E/S asynchrone
En Python, l'implémentation de la programmation d'E/S asynchrone nécessite l'utilisation de bibliothèques appropriées. Les bibliothèques suivantes sont des bibliothèques d'E/S asynchrones couramment utilisées en Python :
Ensuite, nous prendrons la bibliothèque asyncio comme exemple pour présenter les techniques de programmation d'E/S asynchrones en Python.
Dans la bibliothèque asyncio, la coroutine est l'unité de base de la programmation asynchrone. Il s'agit d'un thread léger qui peut exécuter plusieurs coroutines simultanément dans un seul thread. Une coroutine peut être considérée comme une fonction qui peut suspendre et reprendre l'exécution. Elle peut utiliser l'instruction rendement pour suspendre son exécution. Dans Python 3.5 et versions ultérieures, le mot-clé async/await facilite la création et la gestion de coroutines.
Ce qui suit est un exemple simple de coroutine :
import asyncio async def coroutine_demo(): print("Start") await asyncio.sleep(1) print("End")
Le code ci-dessus définit une coroutine nommée coroutine_demo. L'instruction wait est utilisée dans la coroutine, indiquant que la coroutine attendra les opérations d'E/S asynchrones lors de son exécution. . La fonction sleep de la bibliothèque asyncio est utilisée ici pour simuler le temps d'attente lors des opérations d'E/S.
La boucle d'événements de la bibliothèque asyncio est au cœur des opérations d'E/S asynchrones. La boucle d'événements utilise une boucle infinie pour écouter les événements asynchrones lorsqu'un événement se produit, il peut être traité et renvoyé immédiatement. La boucle d'événements peut être comprise comme un système de messages, dans lequel les messages sont le résultat d'opérations d'E/S asynchrones.
Voici un exemple de boucle d'événement simple :
import asyncio async def coroutine_demo(): print("Start") await asyncio.sleep(1) print("End") loop = asyncio.get_event_loop() loop.run_until_complete(coroutine_demo()) loop.close()
Dans cet exemple, une coroutine nommée coroutine_demo est d'abord définie. Ensuite, une boucle d'événements est créée et la coroutine coroutine_demo est exécutée à l'aide de la méthode run_until_complete(). Après l'exécution, la coroutine affichera « Start » sur la première ligne, puis attendra 1 seconde avant d'afficher « End ».
Il est à noter que la boucle d'événements doit s'exécuter dans le thread principal. Si nous appelons la méthode run_loop() dans d’autres threads, le programme lèvera une exception.
Dans la programmation d'E/S asynchrone, lorsqu'un événement asynchrone se produit, la boucle d'événements informera la coroutine d'exécuter la fonction de rappel correspondante. La fonction de rappel est une fonction ordinaire utilisée pour gérer les résultats des opérations d'E/S asynchrones.
Ce qui suit est un exemple simple de fonction de rappel :
import asyncio async def coroutine_demo(): print("Start") await asyncio.sleep(1) print("End") def callback_func(future): print("Callback function") loop = asyncio.get_event_loop() future = asyncio.ensure_future(coroutine_demo()) future.add_done_callback(callback_func) loop.run_until_complete(future) loop.close()
Dans cet exemple, la fonction callback_func est une fonction de rappel qui est appelée lorsque la coroutine termine son exécution.
Dans la programmation d'E/S asynchrone, presque toutes les opérations d'E/S doivent être encapsulées dans des coroutines à l'aide du mot-clé async/await. Par exemple, vous pouvez utiliser la fonction open de la bibliothèque asyncio pour lire et écrire des fichiers de manière asynchrone :
import asyncio async def read_file(path): async with aiohttp.ClientSession() as session: async with session.get(path) as response: return await response.text() loop = asyncio.get_event_loop() result = loop.run_until_complete(read_file("http://example.com")) loop.close()
Dans cet exemple, nous utilisons l'objet ClientSession de la bibliothèque aiohttp pour effectuer une requête HTTP asynchrone. Après avoir obtenu la réponse, utilisez le. Mot-clé wait pour obtenir réponse.text(), c'est la clé pour faire attendre les E/S asynchrones.
Résumé
Comme mentionné ci-dessus, la programmation d'E/S asynchrones est un modèle de programmation efficace qui peut grandement améliorer l'efficacité d'exécution et la réactivité du programme. Le langage Python possède une bibliothèque d'E/S asynchrones très riche, comprenant la bibliothèque asyncio de la bibliothèque standard Python et les bibliothèques tierces Tornado et gevent. L'apprentissage des compétences en programmation d'E/S asynchrones est très nécessaire pour les programmeurs de serveurs Python.
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!