Warten auf Godot — Ausführung asynchron

Nicht zum ersten mal stelle ich fest, dass in Python manche Dinge überraschend einfach sind, sogar das Warten auf Godot eine nebenläufige Tätigkeit. Bei dem Thema “asynchrone Ausführung” hatte ich vor längerem einen Vortrag auf einer Konferenz zum Thema VB.Net gesehen, was mich auf den Gedanken gebracht hat, es in Python ebenfalls zu suchen. Und siehe da, es geht! Und wie es geht!

Nehmen wir an, wir hätten die Funktionen namens “daten_beschaffung”, “gui_aufbau” und “daten_anzeigen” geschrieben, die für sich bereits funktionieren. Dummerweise brauchen beide ein wenig Zeit, bis die Arbeit getan ist. Würden wir sie nacheinander an die Arbeit schicken, wäre der Zeitbedarf entsprechend höher, denn zunächst müsste abgewartet werden, bis die erste Aufgabe erledigt ist, bevor die zweite begonnen werden kann.

Nehmen wir ferner an, dass diese “Arbeiten” voneinander unabhängig sind und die Instanzen nicht miteinander kommunizieren müssen. Viele Voraussetzungen, aber wenn es denn so ist, ist alles recht überschaubar.

from concurrent import futures

executor = futures.ThreadPoolExecutor(max_workers = 2)
executor.submit(daten_beschaffung)
executor.submit(gui_aufbau)
executor.shutdown()
daten_anzeigen()

Was hier passiert ist schnell erklärt. Die Methode “submit()” übergibt die Verantwortung zur Ausführung der Funktionen an den ThreadPoolExecutor, dem wir zu Beginn die maximale Anzahl gleichzeitig auszuführender Threads mitgeteilt haben. Idealerweise genau die Anzahl der Funktionen auf unserer Todo-Liste. Das müsste aber nicht sein; sind es weniger, muss halt doch mal gewartet werden.

Mit der Methode “.shutdown()” sorgen wir dafür, dass unser Programm so lange wartet, bis der letzte Thread beendet ist (submit tut das nämlich nicht). Und das war’s auch schon.

Somit erfolgt die Datenbeschaffung und der GUI-Aufbau asynchron (also quasi-parallel). Mit etwas Glück sind beide gleichzeitig fertig, so dass die anschließende Anzeige der Daten zügig erfolgen kann.

Gottseidank dauert es in den meisten Fällen nicht so lange wie in dem Theaterstück. Das hätte sich Samuel Beckett sicher nicht träumen lassen.

P.S.: Nein, das ist kein Aprilscherz :-)

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

4 + 3 =