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 taken –
async defdefinieert een werkeenheid;asyncio.create_task()plant er één tegelijk in en geeft eenTaskterug 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 klasseLoopstelt de rest beschikbaar voor de zeldzame gevallen die het nodig hebben.Coördinatie –
gather()voor uitwaaieren en samenvoegen,wait_for()voor deadlines,Task.cancelen het opruimpatroon met definally-clausule, uitzonderingspropagatie door taken en gather-aanroepen, en de uitzonderingshandler-hook van de loop.Synchronisatieprimitieven –
Eventvoor signalering tussen coroutines,Lockvoor het serialiseren van toegang tot een gedeelde bron over awaits heen, enThreadSafeFlagvoor 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 vanawaitzijn,__aiter__/__anext__voorasync for, en__aenter__/__aexit__voorasync with.Framevastlegging – de wrapper die
csi.CSI.snapshot()omzet in eenawait-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.