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 tasks –
async defdefinierar en arbetsenhet;asyncio.create_task()schemalägger en samtidigt och returnerar enTasksom 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; klassenLoopexponerar resten för de sällsynta fall som behöver det.Koordinering –
gather()för förgrening ut och in,wait_for()för tidsfrister,Task.canceloch rensningsmönstret medfinally-sats, undantagsspridning genom tasks och gather-anrop, samt loopens hook för undantagshanterare.Synkroniseringsprimitiver –
Eventför signalering mellan coroutiner,Lockför att serialisera åtkomst till en delad resurs över awaits, ochThreadSafeFlagfö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örawait,__aiter__/__anext__förasync for, och__aenter__/__aexit__förasync with.Bildrutefångst – omslaget som förvandlar
csi.CSI.snapshot()till enawait-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.