Go-Tutorial, Teil 3/3: Nebenläufigkeit

Für nebenläufige Funktionen nutzt Go leichtgewichtige Goroutinen. Im Beispiel erweitern sie den "GitHub Progress Monitor" und automatisieren Event-Analysen.

Artikel verschenken
In Pocket speichern vorlesen Druckansicht
Go-Tutorial, Teil 3/3: Nebenläufigkeit
Lesezeit: 14 Min.
Von
  • Frank Müller
Inhaltsverzeichnis

Eine Besonderheit von Google Go haben die beiden ersten Tutorialteile bisher nicht behandelt: die Handhabung nebenläufiger Funktionen. Viele Sprachen nutzen dafür Threads. Sie lassen sich gleichzeitig ausführen, die Kommunikation zwischen ihnen erfolgt in der Regel über Shared Memory, für die Synchronisation kommt ein Mutex-Verfahren zum Einsatz.

Jedoch haben Kontextwechsel zwischen Threads einen gewissen Overhead, und Fehler bei der Nutzung der Mutexe können schnell zu Deadlocks führen. Verzichtet man auf sie, muss man hingegen mit inkonsistenten Daten rechnen.

Als Lösung für dieses Dilemma setzt Go Goroutinen ein, leichtgewichtige Funktionen, die ein Multiplexer auf einer Menge von Threads verteilt. Besteht die Gefahr, dass eine Goroutine blockiert, etwa bei der Ausführung eines Systemaufrufs, würden die dem gleichen Thread zugeordneten Goroutinen ebenfalls blockiert. In diesem Fall verschiebt die Laufzeitumgebung die Goroutine auf einen freien Thread und verhindert so die Blockade. Der Entwickler muss hierfür keine Vorsorge treffen. Mit ihrem geringen Overhead gegenüber Threads ist der gleichzeitige Betrieb Tausender Goroutinen auch auf kleinen Systemen möglich und skaliert zudem nahtlos mit der Anzahl der Kerne.