8.1 Caractéristiques principales de la classe Future
La classe Future
dans le module asyncio
représente
le résultat d'une opération asynchrone qui sera disponible dans le futur.
Les objets Future
sont utilisés pour gérer l'état et les résultats
des tâches asynchrones.
Caractéristiques principales de la classe Future
Un objet Future
est un conteneur pour le résultat qui sera
disponible plus tard, lorsque la tâche sera terminée. Il fournit
une interface pour obtenir le résultat ou l'exception qui sera
fixé après la fin de l'opération asynchrone.
Création et gestion des objets Future
-
Création : Habituellement créé en utilisant
loop.create_future()
. -
Fixer le résultat : Le résultat est fixé
à l'aide de la méthode
set_result(result)
. -
Fixer l'exception: L'exception
est fixée à l'aide de la méthode
set_exception(exception)
.
Méthodes et attributs principaux
set_result(result):
Fixe le résultat pour l'objet Future
. Toutes les coroutines qui attendent
cet objet seront immédiatement reprises avec ce résultat.
set_exception(exception):
Fixe l'exception pour l'objet Future
. Toutes les coroutines qui attendent
cet objet seront immédiatement reprises avec cette exception.
result():
Renvoie le résultat de l'objet Future
, s'il est disponible. Si l'opération
s'est terminée avec une exception, elle lancera cette exception.
exception():
Renvoie l'exception si elle a été fixée, ou None
si
l'objet Future
n'est pas encore terminé ou s'est terminé avec succès.
done():
Renvoie True
si l'objet Future
est terminé (avec un résultat ou
une exception).
add_done_callback(callback):
Ajoute un rappel qui sera appelé à la fin
de l'objet Future
.
8.2 Exemples d'utilisation
Fixer et obtenir le résultat
import asyncio
async def set_future_result(fut, delay):
await asyncio.sleep(delay)
fut.set_result("Le résultat du Future est prêt")
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_result(fut, 2))
result = await fut
print(result)
asyncio.run(main())
Gestion des exceptions
import asyncio
async def set_future_exception(fut, delay):
await asyncio.sleep(delay)
fut.set_exception(ValueError("Une erreur s'est produite"))
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_exception(fut, 2))
try:
result = await fut
except ValueError as e:
print(f"Exception capturée : {e}")
asyncio.run(main())
Interaction avec les tâches
Les objets Future
sont souvent utilisés en conjonction avec des tâches (Tasks)
. Quand
une tâche est créée avec asyncio.create_task()
, elle crée automatiquement
un objet Future
qui peut être utilisé pour suivre et
gérer l'état de la tâche.
import asyncio
async def example_coroutine():
await asyncio.sleep(1)
return "Résultat de la tâche"
async def main():
task = asyncio.create_task(example_coroutine())
print(await task)
asyncio.run(main())
8.3 Avantages et caractéristiques
Les objets Future
permettent de gérer les résultats et les exceptions
des opérations asynchrones, offrant flexibilité et contrôle sur
l'exécution. Future
peut être utilisé dans divers scénarios
de programmation asynchrone, y compris les tâches, les temporisateurs, les rappels et bien plus encore.
Souvent, les objets Future
sont utilisés en conjonction avec des tâches (Tasks)
. Cette approche permet un niveau de contrôle plus élevé sur l'exécution et l'état des opérations asynchrones.
Limitations
Dans certains cas, l'utilisation de Future
peut être plus complexe par
rapport à l'utilisation d'abstractions de plus haut niveau, telles que
les tâches (Tasks)
ou les coroutines. Avec Future
, il peut
être nécessaire de gérer plus manuellement l'état et les résultats
des opérations asynchrones.
GO TO FULL VERSION