8. Asyncio

Hittills har varje skript i handledningen varit sekventiellt – en rad körs i taget, och ett anrop som måste vänta (en sensoravläsning, en nätverkstur, en stillbild) blockerar skriptet tills det är klart. Det fungerar så länge det bara finns en sak att göra. I samma stund en applikation behöver göra flera saker samtidigt – köra en stillbildsloop och svara på ett seriellt kommando, och ladda upp bildrutor över nätverket – bryter ett sekventiellt skript samman. Det första långsamma anropet hindrar allt annat från att göra framsteg.

asyncio-modulen är MicroPythons svar. Den låter applikationen beskriva flera jobb som separata coroutiner och köra dem samtidigt på en enda tråd, kooperativt – vilken coroutine som än körs för tillfället lämnar tillbaka kontrollen till schemaläggaren när den måste vänta. En stillbildsloop, en UART-läsare och en nätverksklient kan alla bo i samma skript och de långsamma delarna av den ena fryser inte längre de andra.

Sidorna framöver täcker nyckelorden async/await och livscykeln för Task, samordning genom gather() och wait_for(), avbrytande och undantagspropagering, de tre inbyggda synkroniseringsprimitiverna (Event, Lock, ThreadSafeFlag), språkkrokarna för att koppla in applikationsklasser i asyncio-idiom, en liten CSI-omslagsklass som låter snapshot() köra som en coroutine, och de vanliga fallgropar som följer med kooperativ schemaläggning.

Synkroniseringsprimitiver

Loopkontroll

Bildrutefångst

Fallgropar

Sammanfattning