Open Source im professionellen Einsatz
Linux-Magazin 03/2015
© George Tsartsianidis, 123RF

© George Tsartsianidis, 123RF

Asynchron programmieren mit Python

Jederzeit bereit

Das Python-Modul Asyncio bringt neuen Schwung in vernetzte Anwendungen. Als Alternative zu Threads kann ein Entwickler es geschickt mit bestehenden Python-Bibliotheken kombinieren.

498

Schöpfer von Asyncio [1], das zunächst unter den Namen Tulip entwickelt wurde und seit Python 3.4 in der Standardbibliothek steckt, ist kein Geringerer als Guido van Rossum, der Python-Erfinder höchstselbst. Während seiner Arbeit an der asynchronen Bibliothek führte er ausgiebige Gespräche mit Entwicklern ähnlicher und meist schon fest etablierter Python-Bibliotheken wie Twisted [2], Tornado [3], Gevent [4], Pyzero-MQ ([5], [6]) und Pyftpdlib [7].

Das Ergebnis: Asyncio kann als Grundlage für diese Bibliotheken dienen, denn die Eventloop des Moduls lässt sich in andere Frameworks einbauen. Außerdem bietet Asyncio auf höherem Abstraktionsniveau einen Scheduler auf der Basis von »yield from« an. Van Rossum beschreibt das Modul in dem recht umfangreichen PEP 3156 ([8], Python Enhancement Proposal) sowie in einem auf Youtube verfügbaren Vortrag [9] detailliert. Das API ist vorläufig und Änderungen in Python 3.5 sind noch möglich.

Träge Netzwerke

Computer arbeiten schnell, Netzwerke reagieren im Vergleich dazu träge. Also warten viele Netzwerkanwendungen recht lange, bis eine Anfrage vom Server zurückkehrt. In dieser Wartezeit bleibt die CPU untätig. Es gibt verschiedene Lösungsansätze für das Problem, zu denen etwa Threads, Green Threads oder Callbacks in einer Ereignisschleife (Eventloop) gehören, doch sie alle haben ihre Vor- und Nachteile.

Betriebssystem-Threads brauchen zum Beispiel ein intelligentes Locking, ihre Zahl lässt sich nicht ohne Probleme massiv erhöhen. Alternativ gibt es mit den Microthreads eine Thread-Implementierung im Userspace, auch Green Threads genannt. Sie arbeiten effizienter als ihre OS-Geschwister und können durchaus 10000 Verbindungen in Threads verpacken. Allerdings müssen die Anwendungen zum Teil wissen, dass sie in einem Microthread laufen, um Threadwechsel einzuleiten.

Das neue Modul Asyncio will diese Nachteile vermeiden, indem es möglichst gut mit vorhandenen Frameworks kooperiert. Das klappt, weil die darunterliegenden Eventloops mehrere Nutzungsarten erlauben und trotz unterschiedlicher Ziele auch Gemeinsamkeiten besitzen, etwa das Scheduling und die Callbacks. Das erlaubt es den einzelnen Frameworks, Objekte zu teilen.

Ambitioniertes Konzept

Van Rossums Ziele für das »asyncio« -Modul sind recht ambitioniert. Es läuft auf Unix-, Windows- und OS-X-Systemen, unterstützt IPv4, IPv6, TCP, UDP, eine Implementierung von TLS (SSL) und kann mit Pipes und Subprozessen umgehen. Es soll nicht von weiterer Software abhängen, die Entwickler aber auch möglichst nicht dazu zwingen, eine der beiden wesentlichen Nutzungsarten zu verwenden, die auf Callbacks und »yield from« basieren.

Der Einsatz von Callback-Funktionen lässt sich laut Rossum nicht immer vermeiden, hier ähnelt die Herangehensweise der von Twisted. Callbacks erzwingen eine bestimmte Programmierweise, die sich von der üblichen synchronen deutlich unterscheidet. Der zweite Weg über »yield from« (PEP 380, [10]) steht der synchronen Programmierung schon wesentlich näher.

Letzteres verdeutlichte van Rossum in einem Vortrag mit Hilfe zweier Folien ([9], Abbildung 1). Der asynchrone Programmcode unterscheidet sich vom synchronen lediglich dadurch, dass er an einigen Stellen ein »yield from« sowie den Dekorator »@asyncio.coroutine« vor die Funktionen stellt.

Abbildung 1: Guido van Rossum ließ es sich nicht nehmen, Asyncio persönlich zu präsentieren.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Mein eigenes Album

    Dateisysteme sind vielen Anwendern und Entwicklern fern - sie sind Angebote, die der Kernel bereitstellt. Dabei lassen sich ohne viel Aufwand mit Fuse und Python anwendungsspezifische Sichten auf den eigenen Datenbestand definieren - etwa ein Fotoalbum.

  • Python 3.4

    Die Entwickler haben Python 3.4 an zahlreichen Ecken optimiert und die Standardbibliothek um einige interessante Module erweitert, findet Python-Experte Mike Müller.

  • Python 3.4.0 mit Pip-Integration und neuen Modulen

    Seit gestern ist Python 3.4.0 verfügbar. Zu den Highlights der neuen Version zählen der Pip-Support und neue Module für Statistiken und asynchrone Eingabe-Ausgabe-Operationen.

  • Guter Teamgeist

    Größere Softwareprojekte bedeuten Teamarbeit - doch die will koordiniert sein. Trac, ein Python-basiertes Framework, vereinigt alle nötigen Komponenten unter einer gemeinsamen Weboberfläche.

  • Python 3.5 erschienen

    Die Python-Entwicklung schläft nie: Am Sonntag erschien Python 3.5, das die asynchrone Programmierung verbessert, Matritzenmultiplikation ermöglicht und Verzeichnisse effizienter durchsucht.

comments powered by Disqus

Ausgabe 11/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.