8.16. Afronding

Je hebt de API van asyncio doorlopen – de onderdelen die een script nodig heeft om verschillende taken tegelijk op één enkele CPU uit te voeren:

  • Coöperatieve planning – het model waarop de rest van de module rust. De draaiende coroutine heeft de loop voor zichzelf tot hij awaitt; wisselingen gebeuren alleen op die awaits.

  • Coroutines en takenasync def definieert een werkeenheid; asyncio.create_task() plant er één tegelijk in en geeft een Task terug waar de toepassing later op kan wachten, die geannuleerd of geïdentificeerd kan worden.

  • De event-loop – de motor die coroutines en taken uitvoert. asyncio.run() is het enige toegangspunt dat de meeste scripts nodig hebben; de klasse Loop stelt de rest beschikbaar voor de zeldzame gevallen die het nodig hebben.

  • Coördinatiegather() voor uitwaaieren en samenvoegen, wait_for() voor deadlines, Task.cancel en het opruimpatroon met de finally-clausule, uitzonderingspropagatie door taken en gather-aanroepen, en de uitzonderingshandler-hook van de loop.

  • SynchronisatieprimitievenEvent voor signalering tussen coroutines, Lock voor het serialiseren van toegang tot een gedeelde bron over awaits heen, en ThreadSafeFlag voor het wekken van een asyncio-taak vanuit een interrupt-handler.

  • Aangepaste async-objecten – de taal-hooks waarmee toepassingsklassen kunnen aansluiten op asyncio-idiomen. __await__ voor objecten die zelf het doel van await zijn, __aiter__ / __anext__ voor async for, en __aenter__ / __aexit__ voor async with.

  • Framevastlegging – de wrapper die csi.CSI.snapshot() omzet in een await-vriendelijke coroutine, zodat een vastlegloop naast ander asyncio-werk draait.

  • Valkuilen – vergeten awaits, strakke loops zonder yields, ingeslikte annuleringen, gedeelde toestand die over awaits heen wordt gewijzigd, en de rest van de asyncio-specifieke valstrikken.

Dat is genoeg om programma’s te schrijven die camerawerk, hardware-I/O en gelijktijdig achtergrondwerk op dezelfde loop combineren.

8.16.1. Deze referentie later gebruiken

Behandel de asyncio-hoofdstukken als referentiemateriaal; terugkomen voor de vorm van async with of het exacte gedrag van gather() bij het falen van een broer of zus is het bedoelde gebruik. De referentiepagina asyncio somt elke functie en klasse op één plek op wanneer de vraag alleen is “wat is de exacte naam van deze aanroep”.

Voor rijkere primitieven die bovenop de module zijn gebouwd – semaforen, wachtrijen, barrières en een aanzienlijke verzameling toepassingsgerichte hulpmiddelen – is de repository peterhinch/micropython-async de standaard door de gemeenschap onderhouden bron.

8.16.2. Hoe nu verder

Netwerken is het volgende grote onderwerp. asyncio.open_connection(), asyncio.start_server() en de klasse Stream zijn de manier waarop een asyncio-script vanuit een coroutine met de rest van het netwerk praat, samen met de onderliggende modules network en socket. Alles wat je hebt geleerd over await, Task, annulering en de synchronisatieprimitieven gaat rechtstreeks door.