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âches –
async defdéfinit une unité de travail ;asyncio.create_task()en ordonnance une simultanément et renvoie uneTaskque 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 classeLoopexpose le reste pour les rares cas qui le nécessitent.Coordination –
gather()pour la diffusion et le regroupement,wait_for()pour les échéances,Task.cancelet le motif de nettoyage par clausefinally, 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 synchronisation –
Eventpour la signalisation entre coroutines,Lockpour sérialiser l’accès à une ressource partagée entre des awaits, etThreadSafeFlagpour 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’unawait,__aiter__/__anext__pourasync for, et__aenter__/__aexit__pourasync with.Capture de trame – l’enveloppe qui transforme
csi.CSI.snapshot()en une coroutine compatible avecawait, de sorte qu’une boucle de capture s’exécute aux côtés d’autres travaux asyncio.Pièges – les
awaitoublié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.