8. Asyncio¶
Jusqu’à présent, chaque script du tutoriel était séquentiel – une ligne s’exécute à la fois, et un appel qui doit attendre (une lecture de capteur, un aller-retour réseau, une capture) bloque le script jusqu’à ce qu’il se termine. Cela fonctionne tant qu’il n’y a qu’une seule chose à faire. Dès qu’une application doit faire plusieurs choses à la fois – exécuter une boucle de capture et répondre à une commande série, et téléverser des trames sur le réseau – un script séquentiel s’effondre. Le premier appel lent empêche tout le reste de progresser.
Le module asyncio est la réponse de MicroPython. Il permet à l’application de décrire plusieurs tâches sous forme de coroutines distinctes et de les exécuter de manière concurrente sur un seul thread, coopérativement – la coroutine en cours d’exécution rend le contrôle à l’ordonnanceur chaque fois qu’elle doit attendre. Une boucle de capture, un lecteur UART et un client réseau peuvent tous coexister dans le même script, et les parties lentes de l’un ne gèlent plus les autres.
Les pages qui suivent couvrent les mots-clés async/await et le cycle de vie de Task, la coordination via gather() et wait_for(), l’annulation et la propagation des exceptions, les trois primitives de synchronisation intégrées (Event, Lock, ThreadSafeFlag), les points d’accroche du langage permettant de brancher des classes applicatives dans les idiomes d’asyncio, un petit wrapper CSI qui permet d’exécuter snapshot() comme une coroutine, et les pièges courants qui accompagnent l’ordonnancement coopératif.
Coordination
Primitives de synchronisation
Objets asynchrones personnalisés
Contrôle de la boucle
Capture de trames
Pièges
Conclusion