8. Asyncio¶
Bisher war jedes Skript in diesem Tutorial sequenziell – es läuft jeweils eine Zeile, und ein Aufruf, der warten muss (ein Sensorauslesen, eine Netzwerk-Hin-und-Rückrunde, ein Schnappschuss), blockiert das Skript, bis er abgeschlossen ist. Das funktioniert, solange es nur eine Sache zu tun gibt. Sobald eine Anwendung mehrere Dinge gleichzeitig erledigen muss – eine Schnappschuss-Schleife ausführen und einen seriellen Befehl beantworten und Einzelbilder über das Netzwerk hochladen – bricht ein sequenzielles Skript zusammen. Der erste langsame Aufruf hindert alles andere daran, voranzukommen.
Das Modul asyncio ist MicroPythons Antwort darauf. Es ermöglicht der Anwendung, mehrere Aufgaben als separate Koroutinen zu beschreiben und sie nebenläufig auf einem einzigen Thread auszuführen, und zwar kooperativ – die gerade laufende Koroutine gibt die Kontrolle an den Scheduler zurück, sobald sie warten muss. Eine Schnappschuss-Schleife, ein UART-Leser und ein Netzwerk-Client können alle im selben Skript leben, und die langsamen Teile des einen blockieren die anderen nicht mehr.
Die folgenden Seiten behandeln die Schlüsselwörter async/await und den Lebenszyklus von Task, die Koordination über gather() und wait_for(), Abbruch und Ausnahmen-Weitergabe, die drei eingebauten Synchronisationsprimitive (Event, Lock, ThreadSafeFlag), die Sprach-Hooks zum Einbinden eigener Anwendungsklassen in asyncio-Idiome, einen kleinen CSI-Wrapper, mit dem snapshot() als Koroutine ausgeführt werden kann, sowie die häufigen Fallstricke, die mit kooperativem Scheduling einhergehen.
Koordination
Synchronisationsprimitive
Eigene asynchrone Objekte
Schleifensteuerung
Einzelbilderfassung
Fallstricke
Zusammenfassung