goroutine ·
channel ·
select ·
WaitGroup ·
Mutex ·
Worker Pool
Go ist bekannt für seine eingebaute Concurrency-Unterstützung. Goroutinen sind leichtgewichtige Threads, Channels ermöglichen die sichere Kommunikation zwischen ihnen, und Synchronisationsprimitive wie WaitGroup und Mutex helfen bei der Koordination.
Goroutinen sind leichtgewichtige, gleichzeitig ausgeführte Funktionen. Sie werden mit dem Schlüsselwort go gestartet und laufen unabhängig vom Hauptprogramm. Das Hauptprogramm endet, ohne auf die Goroutinen zu warten – daher oft in Kombination mit WaitGroup.
sync.WaitGroup oder time.Sleep, um auf die Beendigung zu warten.
Channels sind die primäre Kommunikationsmethode zwischen Goroutinen. Sie sind typisiert und können entweder ungepuffert (blockierend) oder gepuffert (asynchron) sein. Channels können geschlossen und mit range iteriert werden.
close(ch), um einen Channel zu schließen. Empfänger können prüfen, ob der Channel geschlossen wurde: v, ok := <-ch. Ein geschlossener Channel liefert den Zero-Value und ok == false.
select blockiert, bis einer seiner case-Zweige bereit ist – ähnlich wie switch, aber für Channels. Es ermöglicht das gleichzeitige Abhören mehrerer Channels und ist ideal für Timeouts, Heartbeats und Multiplexing.
select mit default ist nicht-blockierend – perfekt für nicht-blockierende Lese-/Schreiboperationen. Für Timeouts verwenden Sie time.After innerhalb eines case.
WaitGroup wird verwendet, um auf die Beendigung mehrerer Goroutinen zu warten. Es ist ein Zähler, der mit Add erhöht, mit Done verringert und mit Wait blockiert, bis der Zähler auf 0 ist.
Add sollte aufgerufen werden, bevor die Goroutine gestartet wird. Verwenden Sie defer wg.Done() am Anfang der Goroutine, um sicherzustellen, dass sie immer aufgerufen wird – auch bei Panics.
Mutex (Mutual Exclusion) schützt gemeinsame Ressourcen vor gleichzeitigem Zugriff aus mehreren Goroutinen. Lock blockiert, bis die Sperre verfügbar ist, Unlock gibt sie frei. RWMutex erlaubt mehrere Leser, aber nur einen Schreiber.
defer mu.Unlock() unmittelbar nach mu.Lock(), um Deadlocks zu vermeiden. Für häufige Lese-, seltene Schreibzugriffe ist RWMutex effizienter.
Worker Pool ist ein Muster zur Begrenzung der Anzahl gleichzeitig laufender Goroutinen. Jobs werden über einen Channel verteilt, die Ergebnisse über einen weiteren Channel gesammelt. Ideal für CPU-intensive oder I/O-intensive Aufgaben.
go
chan
select
WaitGroup
Mutex
Worker Pool
go func() { ... }() ·
ch <- value ·
select { case <-ch: } ·
var wg sync.WaitGroup