Wie wird das Modell der Arbeit mit Konkurrenz und Synchronisation in der Programmiersprache Go umgesetzt?
sobes.tech KI
Antwort von AI
In der Programmiersprache Go wird Nebenläufigkeit durch leichte Threads namens Goroutines realisiert. Goroutines werden mit dem Schlüsselwort go gestartet und laufen parallel, wobei die Go-Laufzeitumgebung ihre Planung eigenständig verwaltet.
Zur Synchronisation und zum Datenaustausch zwischen Goroutines werden mehrere Mechanismen verwendet:
-
Kanäle (channels) — ermöglichen eine sichere Datenübertragung zwischen Goroutines und gewährleisten die Synchronisation. Kanäle können als Warteschlangen betrachtet werden, die den Sender blockieren, wenn der Kanal voll ist, und den Empfänger, wenn er leer ist.
-
Paket sync — enthält Synchronisationsprimitive wie Mutexes (
sync.Mutex), Bedingungsvariablen (sync.Cond), Wartegruppen (sync.WaitGroup) und andere.
Beispiel für die Verwendung von Goroutines und Kanälen:
package main
import (
"fmt"
"time"
)
func worker(id int, ch chan string) {
time.Sleep(time.Second)
ch <- fmt.Sprintf("Arbeiter %d fertig", id)
}
func main() {
ch := make(chan string)
for i := 1; i <= 3; i++ {
go worker(i, ch)
}
for i := 1; i <= 3; i++ {
msg := <-ch
fmt.Println(msg)
}
}
Hier laufen drei Goroutines parallel, und der Kanal wird verwendet, um die Ergebnisse von jeder zu empfangen.