8.13. Contrôle de la boucle#
La plupart des scripts asyncio ne touchent jamais directement à la boucle d’événements – asyncio.run() suffit. Cette page couvre l’interface Loop pour les cas où ce n’est pas le cas : installer un gestionnaire d’exceptions, exécuter la boucle avec un cycle de vie différent de run, ou conserver l’objet boucle à des fins d’instrumentation.
8.13.1. Obtenir la boucle#
asyncio.get_event_loop()– renvoie l’objetLoop. Peut être appelé en toute sécurité depuis l’intérieur ou l’extérieur d’une coroutine.asyncio.new_event_loop()– sur MicroPython, réinitialise l’état de la boucle existante au lieu d’en créer une nouvelle. La remarque mérite d’être répétée : il y a exactement une boucle d’événements par programme.
Il n’existe aucune API pour exécuter la boucle autre que les méthodes de Loop et asyncio.run().
8.13.2. Exécuter la boucle directement#
asyncio.run() est le bon point d’entrée pour presque toutes les applications. Deux méthodes de Loop existent pour les cas où ce n’est pas le cas.
run_until_complete()– étant donné un awaitable, exécute la boucle jusqu’à ce que cet awaitable se termine, puis renvoie son résultat. Équivalent à un seul appel àasyncio.run(), sans le démantèlement de la boucle.run_forever()– exécute la boucle jusqu’à ce questop()soit appelé depuis l’intérieur d’une tâche. Pas d’awaitable de premier niveau ; l’application est censée planifier tout ce dont elle a besoin viaasyncio.create_task()avant d’appelerrun_forever.
Les méthodes associées sont stop() (demande à la boucle de s’arrêter après la fin de la tâche courante) et close() (libère les ressources de la boucle).
8.13.3. Création de tâches côté boucle#
create_task()– même opération queasyncio.create_task(). La fonction libre existe pour que le code applicatif n’ait pas besoin d’une référence à la boucle dans le cas courant ; la méthode existe pour l’instrumentation qui en possède déjà une.
8.13.4. Gestionnaires d’exceptions#
La boucle appelle un gestionnaire lorsqu’une tâche lève une exception que rien dans la chaîne d’appel de la coroutine n’a interceptée – un cas typique étant une tâche que l’application a créée avec asyncio.create_task() et n’a jamais attendue. Le gestionnaire par défaut affiche une trace d’appels via sys.stderr ; la page sur les exceptions a montré comment le remplacer par un gestionnaire personnalisé.
set_exception_handler()– installe un gestionnaire personnalisé. Le gestionnaire est un appelablehandler(loop, context)oùcontextest un dictionnaire contenant au moins'message'et généralement'exception'et'future'.get_exception_handler()– renvoie le gestionnaire actuellement installé, ouNonesi celui par défaut est utilisé.default_exception_handler()– le gestionnaire intégré. Utile à l’intérieur d’un gestionnaire personnalisé qui souhaite aussi exécuter le comportement par défaut (journaliser dans la mémoire flash et afficher une trace d’appels, par exemple).call_exception_handler()– exécute le gestionnaire actuellement installé avec un dictionnaire de contexte construit à la main. Utilisé principalement par la boucle elle-même ; une application en a rarement besoin.