3 Punkte von GN⁺ 2024-05-09 | Noch keine Kommentare. | Auf WhatsApp teilen
  • 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.

Noch keine Kommentare.