- Asyncio ist eine gute Methode, um in Python I/O-gebundene Programme zu behandeln, und bietet im Kern eine nützliche Abstraktionsschicht über Python-Generatoren
- Generatoren machen Code speichereffizient und können mit dem Schlüsselwort
yield Funktionen anhalten und fortsetzen
- Mit
yield from kann ein Generator einen Sub-Generator oder ein iterierbares Objekt aufrufen und so eine Generator-Kette bilden
Event Loop
- Das Herzstück von Asyncio ist der Event Loop, der die aktuellen Tasks ausführt und verwaltet
- Der Event Loop durchläuft wiederholt eine Liste von Tasks und führt jeden Task mit
next(task) aus
- Während I/O-Operationen verwendet ein Task
yield, um die Ausführung anzuhalten und die Kontrolle an den Event Loop zurückzugeben
Schlafen
- Mit
yield from kann einem Task ein Sub-Generator hinzugefügt werden
- Fügt man einen Sleep-Generator hinzu, kann die Ausführung eines Tasks bis zu einem festgelegten Zeitpunkt pausiert werden
- Wenn Sleep die
while-Schleife verlässt, wird eine StopIteration-Exception ausgelöst, sodass yield from in der Task-Funktion mit der nächsten Codezeile fortfährt
Von Yield zu Await
- Mit der Dunder-Methode
__await__ und dem Schlüsselwort async lässt sich der Übergang von yield zu await vollziehen
- Das Schlüsselwort
await kann die Methode __await__ einer Klasseninstanz aufrufen oder in einer Coroutine verwendet werden, also in einem Objekt, das von einer async-Funktion erzeugt wurde
- Das Schlüsselwort
await kann als Synonym für yield from gesehen werden, mit einigen zusätzlichen Regeln zur Validitätsprüfung
- Man erstellt eine eigene
Task-Klasse, implementiert die Methode __await__ und fügt dem Event Loop über die Funktion create_task erzeugte Tasks hinzu
- Der Verwalter des Event Loops führt Tasks aus und markiert sie als abgeschlossen, wenn eine
StopIteration-Exception auftritt
- Auch die Sleep-Funktion muss angepasst werden, damit sie mit async kompatibel ist
AsyncIO und Await
- Wenn man im obigen Code "jacobio" durch "asyncio" ersetzt, verwendet man vollständig das asyncio-Paket
- Asyncio erledigt deutlich mehr, aber die Kernelemente von asyncio lassen sich ausgehend von einfachen Generatoren von Grund auf nachbauen
- Im echten asyncio-Paket können mit Funktionen wie
asyncio.gather() mehrere Tasks verarbeitet werden
Meinung von GN⁺
- Der Artikel erklärt die Funktionsweise von asyncio mithilfe von Generatoren leicht verständlich und dürfte besonders Entwicklern helfen, die asyncio zum ersten Mal kennenlernen
- Asyncio ist eine auf performante I/O-Verarbeitung optimierte Bibliothek; wer ihre interne Struktur versteht, kann sie in realen Projekten wirkungsvoller einsetzen
- Allerdings ist das echte asyncio wesentlich komplexer aufgebaut, sodass für den praktischen Einsatz ein tieferes Studium, etwa anhand der offiziellen Dokumentation, nötig sein dürfte
- Andere Bibliotheken mit ähnlicher Funktionalität wie Asyncio sind etwa Trio und Curio; ein Vergleich der Unterschiede wäre ebenfalls interessant
- Bei der Einführung von Asyncio gibt es viele Punkte zu beachten, darunter die Kompatibilität mit bestehendem synchronem Code, Error Handling und Tests; daher sind sorgfältige Prüfung und Vorbereitung erforderlich
Noch keine Kommentare.