8.16. Conclusion

Vous avez parcouru l’API d’asyncio – les éléments dont un script a besoin pour exécuter plusieurs tâches simultanément sur un seul processeur :

  • Ordonnancement coopératif – le modèle sur lequel repose le reste du module. La coroutine en cours d’exécution a la boucle pour elle seule jusqu’à ce qu’elle fasse un await ; les changements de contexte ne se produisent qu’à ces awaits.

  • Coroutines et tâchesasync def définit une unité de travail ; asyncio.create_task() en ordonnance une simultanément et renvoie une Task que l’application peut ensuite attendre, annuler ou identifier.

  • La boucle d’événements – le moteur qui exécute les coroutines et les tâches. asyncio.run() est le seul point d’entrée dont la plupart des scripts ont besoin ; la classe Loop expose le reste pour les rares cas qui le nécessitent.

  • Coordinationgather() pour la diffusion et le regroupement, wait_for() pour les échéances, Task.cancel et le motif de nettoyage par clause finally, la propagation des exceptions à travers les tâches et les appels à gather, et le point d’accroche du gestionnaire d’exceptions de la boucle.

  • Primitives de synchronisationEvent pour la signalisation entre coroutines, Lock pour sérialiser l’accès à une ressource partagée entre des awaits, et ThreadSafeFlag pour réveiller une tâche asyncio depuis un gestionnaire d’interruption.

  • Objets async personnalisés – les points d’accroche du langage qui permettent aux classes applicatives de s’intégrer aux idiomes d’asyncio. __await__ pour les objets qui sont eux-mêmes la cible d’un await, __aiter__ / __anext__ pour async for, et __aenter__ / __aexit__ pour async with.

  • Capture de trame – l’enveloppe qui transforme csi.CSI.snapshot() en une coroutine compatible avec await, de sorte qu’une boucle de capture s’exécute aux côtés d’autres travaux asyncio.

  • Pièges – les await oubliés, les boucles serrées sans cessions de contrôle, les annulations avalées, l’état partagé muté entre des awaits, et le reste des pièges propres à asyncio.

Cela suffit pour écrire des programmes qui mêlent travail de caméra, E/S matérielles et travail d’arrière-plan concurrent sur la même boucle.

8.16.1. Utiliser cette référence par la suite

Considérez les chapitres sur asyncio comme du matériel de référence ; y revenir pour la forme de async with ou le comportement exact de gather() face à l’échec d’une coroutine sœur est l’usage prévu. La page de référence du module asyncio énumère chaque fonction et classe en un seul endroit lorsque la question est simplement « quel est le nom exact de cet appel ».

Pour des primitives plus riches construites par-dessus le module – sémaphores, files, barrières, et une collection substantielle d’utilitaires de forme applicative – le dépôt peterhinch/micropython-async est la source standard maintenue par la communauté.

8.16.2. Où aller à partir d’ici

Le réseau est le prochain sujet majeur. asyncio.open_connection(), asyncio.start_server() et la classe Stream sont la manière dont un script asyncio communique avec le reste du réseau depuis l’intérieur d’une coroutine, conjointement avec les modules network et socket sous-jacents. Tout ce que vous avez appris sur await, Task, l’annulation et les primitives de synchronisation se transpose directement.