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.
Créons une tâche asynchrone qui va simplement attendre 10 secondesEnveloppons-la dans un objetTaskAttendons une seconde pour que la tâche (Task) commence à s'exécuterAnnulons la tâche –task.cancel()-
Si ensuite nous essayons d'attendre la fin de la tâche (Task) avec l'opérateurawait, nous obtiendrons l'exceptionCancelledError.
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.
GO TO FULL VERSION