CodeGym /Cours /Python SELF FR /Classe Task

Classe Task

Python SELF FR
Niveau 26 , Leçon 0
Disponible

7.1 Création de tâches

La classe Task dans le module asyncio est utilisée pour gérer l'exécution des coroutines. Les tâches (Tasks) sont des enveloppes pour les coroutines, permettant de gérer leur exécution et de suivre leur état. La classe Task permet d'exécuter des coroutines en parallèle, en les gérant via la boucle d'événements.

Méthodes principales de la classe Task

La classe Task est une sorte d'enveloppe autour d'une coroutine qui offre des fonctionnalités supplémentaires telles que:

Gestion de l'exécution des coroutines :

Les tâches permettent de gérer facilement l'exécution des coroutines, de contrôler leur état et d'obtenir les résultats.

Annulation des tâches :

La possibilité d'annuler des tâches rend Task utile pour la gestion des opérations longues qui peuvent nécessiter un arrêt avant leur achèvement.

Callbacks :

Les tâches prennent en charge l'ajout de callbacks, ce qui permet d'exécuter des actions supplémentaires à l'achèvement des tâches.

Création de tâches :

Les tâches sont créées à l'aide de la fonction asyncio.create_task(coroutine) ou de la méthode loop.create_task(coroutine), qui planifient l'exécution de la coroutine.


import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
async def main():
    task = asyncio.create_task(say_hello())
    await task
            
asyncio.run(main())

7.2 Méthodes principales

Méthode Task.cancel() :

Demande l'annulation de la tâche. Si la tâche n'est pas encore terminée, elle sera terminée avec l'appel de l'exception CancelledError.

Écrivons un petit programme qui nous permettra de le démontrer.

  1. Créons une tâche asynchrone qui va simplement attendre 10 secondes
  2. Enveloppons-la dans un objet Task
  3. Attendons une seconde pour que la tâche (Task) commence à s'exécuter
  4. Annulons la tâche – task.cancel()
  5. Si ensuite nous essayons d'attendre la fin de la tâche (Task) avec l'opérateur await, nous obtiendrons l'exception CancelledError.

import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(10)) 
    await asyncio.sleep(1)
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("Task was cancelled")
            
asyncio.run(main())

Méthode Task.result() :

Retourne le résultat de l'exécution de la tâche. Si la tâche s'est terminée par une exception, elle sera levée lors de l'appel de result().


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1, result='Completed'))
    result = await task
    print(result)  # Output: Completed
            
asyncio.run(main())

Dans notre cas, il n'a même pas été nécessaire d'écrire du code supplémentaire — l'opérateur await sait comment travailler avec un objet Task : après l'exécution de la tâche il appellera lui-même sa méthode result() et renverra le résultat obtenu.

Méthode Task.exception() :

Retourne l'exception levée par la tâche. Si la tâche s'est terminée sans exception, elle retourne None.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    try:
        result = await task
    except Exception as e:
        print(f"Task failed with exception: {e}")

asyncio.run(main())

Il n'est également pas nécessaire d'écrire de code supplémentaire — si une exception survient dans la tâche, la méthode exception() sera appelée par l'opérateur await.

Méthode Task.add_done_callback(callback) :

Ajoute un callback (callback), qui sera appelé à l'achèvement de la tâche.


import asyncio

def callback(future):
    print("Task completed")
            
async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    task.add_done_callback(callback)
    await task
            
asyncio.run(main())

Une fonction peut être ajoutée à une tâche et sera automatiquement appelée lorsque la tâche terminera son exécution. Cette approche permet de rendre le code très flexible. De plus, plusieurs fonctions peuvent être ajoutées, et elles peuvent être ajoutées à n'importe quelle tâche.

Méthode Task.done() :

Retourne True si la tâche est terminée (avec succès, avec une erreur ou a été annulée).


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    await asyncio.sleep(1.5)
    print(task.done())  # Output: True
            
asyncio.run(main())

Avec la méthode done(), on peut savoir si la tâche a réussi. En réalité, si elle s'est terminée ou a été annulée, car si une exception se produit, alors formellement la tâche peut ne pas être terminée, mais elle n'a pas non plus été annulée. En gros, si la tâche a été annulée (cancel), la méthode retournera False, sinon elle retournera True.

2
Mission
Python SELF FR, niveau 26, leçon 0
Bloqué
Gestion de la boucle d'événements
Gestion de la boucle d'événements
2
Mission
Python SELF FR, niveau 26, leçon 0
Bloqué
Annulation de la tâche
Annulation de la tâche
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION