8.16. Sammanfattning

Du har gått igenom asyncios API – de delar ett skript behöver för att köra flera jobb samtidigt på en enda CPU:

  • Kooperativ schemaläggning – modellen som resten av modulen vilar på. Den körande coroutinen har loopen för sig själv tills den awaitar; växlingar sker endast vid dessa awaits.

  • Coroutiner och tasksasync def definierar en arbetsenhet; asyncio.create_task() schemalägger en samtidigt och returnerar en Task som applikationen senare kan vänta på, avbryta eller identifiera.

  • Händelseloopen – motorn som kör coroutiner och tasks. asyncio.run() är den enda ingångspunkt de flesta skript behöver; klassen Loop exponerar resten för de sällsynta fall som behöver det.

  • Koordineringgather() för förgrening ut och in, wait_for() för tidsfrister, Task.cancel och rensningsmönstret med finally-sats, undantagsspridning genom tasks och gather-anrop, samt loopens hook för undantagshanterare.

  • SynkroniseringsprimitiverEvent för signalering mellan coroutiner, Lock för att serialisera åtkomst till en delad resurs över awaits, och ThreadSafeFlag för att väcka en asyncio-task från en avbrottshanterare.

  • Anpassade async-objekt – språkhookarna som låter applikationsklasser kopplas in i asyncio-idiom. __await__ för objekt som själva är målet för await, __aiter__ / __anext__ för async for, och __aenter__ / __aexit__ för async with.

  • Bildrutefångst – omslaget som förvandlar csi.CSI.snapshot() till en await-vänlig coroutine, så att en fångstloop kör tillsammans med annat asyncio-arbete.

  • Fallgropar – bortglömda awaitar, snäva loopar utan yields, sväljda avbrott, delat tillstånd som muteras över awaits, och resten av de asyncio-specifika fällorna.

Det räcker för att skriva program som blandar kameraarbete, hårdvaru-I/O och samtidigt bakgrundsarbete på samma loop.

8.16.1. Att använda denna referens senare

Behandla asyncio-kapitlen som referensmaterial; att komma tillbaka för formen på async with eller det exakta beteendet hos gather() vid ett systerfel är den avsedda användningen. Referenssidan för asyncio listar varje funktion och klass på ett ställe när frågan bara är ”vad är det exakta namnet på detta anrop”.

För rikare primitiver byggda ovanpå modulen – semaforer, köer, barriärer och en omfattande samling applikationsformade hjälpfunktioner – är förvaret peterhinch/micropython-async den vanliga community-underhållna källan.

8.16.2. Vart man går härifrån

Nätverk är nästa stora ämne. asyncio.open_connection(), asyncio.start_server() och klassen Stream är hur ett asyncio-skript talar med resten av nätverket inifrån en coroutine, tillsammans med modulerna network och socket under huven. Allt du har lärt dig om await, Task, avbrott och synkroniseringsprimitiverna förs direkt vidare.