Maison  >  Article  >  développement back-end  >  Compétences en programmation serveur Python : implémentation de la programmation d'E/S asynchrones

Compétences en programmation serveur Python : implémentation de la programmation d'E/S asynchrones

王林
王林original
2023-06-18 10:53:23817parcourir

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 :

  1. Efficacité supérieure : la programmation d'E/S asynchrone peut utiliser pleinement les ressources informatiques et améliorer l'efficacité d'exécution du programme. En effet, lorsqu'une opération d'E/S est en attente, vous pouvez immédiatement passer à une autre opération au lieu d'attendre d'être bloqué, évitant ainsi la perte de temps d'attente.
  2. Meilleure évolutivité : dans la programmation d'E/S asynchrone, les applications peuvent gérer plusieurs connexions simultanément sans bloquer ni épuiser les ressources des threads. Cela facilite la programmation d'E/S asynchrones pour prendre en charge un grand nombre de connexions simultanées.
  3. Meilleure réactivité : la programmation d'E/S asynchrone peut rendre le programme plus flexible, répondre aux demandes des utilisateurs en temps opportun et terminer les opérations d'E/S plus rapidement lors de la gestion d'un grand nombre de connexions simultanées.

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 :

  1. asyncio : La bibliothèque d'E/S asynchrones de la bibliothèque standard Python fournit une prise en charge des E/S asynchrones au niveau du système d'exploitation et peut gérer les connexions réseau asynchrones et IPC (inter -processus de communication).
  2. Tornado : Un framework Web très puissant et une bibliothèque d'E/S asynchrones avec une bibliothèque réseau asynchrone hautes performances et des fonctions d'E/S asynchrones.
  3. gevent, etc. : en plus de la bibliothèque d'E/S asynchrones dans la bibliothèque standard Python, certaines bibliothèques tierces offrent également une très bonne prise en charge des E/S asynchrones.

Ensuite, nous prendrons la bibliothèque asyncio comme exemple pour présenter les techniques de programmation d'E/S asynchrones en Python.

  1. Définition de la coroutine

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.

  1. Boucle d'événements

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.

  1. Fonction de rappel

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.

  1. Opérations d'E/S asynchrones

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!

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