8. Asyncio¶
Tot nu toe is elk script in de tutorial sequentieel geweest – er draait één regel tegelijk, en een aanroep die moet wachten (een sensoruitlezing, een netwerkronde, een momentopname) blokkeert het script totdat deze klaar is. Dat werkt zolang er maar één ding te doen is. Zodra een applicatie meerdere dingen tegelijk moet doen – een momentopname-lus draaien én een seriële opdracht beantwoorden, én frames over het netwerk uploaden – valt een sequentieel script door de mand. De eerste trage aanroep weerhoudt al het andere ervan vooruitgang te boeken.
De module asyncio is het antwoord van MicroPython. Hiermee kan de applicatie meerdere taken beschrijven als afzonderlijke coroutines en deze gelijktijdig op één thread uitvoeren, op coöperatieve wijze – welke coroutine op dat moment ook draait, deze geeft de controle terug aan de planner zodra hij moet wachten. Een momentopname-lus, een UART-lezer en een netwerkclient kunnen allemaal in hetzelfde script bestaan en de trage delen van de een bevriezen de anderen niet langer.
De volgende pagina’s behandelen de sleutelwoorden async/await en de levenscyclus van Task, coördinatie via gather() en wait_for(), annulering en het doorgeven van uitzonderingen, de drie ingebouwde synchronisatieprimitieven (Event, Lock, ThreadSafeFlag), de taalhaken om applicatieklassen in asyncio-idioom te koppelen, een kleine CSI-wrapper waarmee snapshot() als coroutine kan draaien, en de veelvoorkomende valkuilen die bij coöperatieve planning horen.
Coördinatie
Synchronisatieprimitieven
Aangepaste async-objecten
Lusbesturing
Frame-opname
Valkuilen
Afronding