Junior — Middle
Wie erfolgt der Wechsel der Ausführung zwischen verschiedenen Goroutines in der Programmiersprache Go?
sobes.tech KI
Antwort von AI
In der Programmiersprache Go erfolgt der Wechsel der Ausführung zwischen Goroutines durch den Scheduler des Go-Laufzeitsystems, der das M:N-Modell implementiert — eine Menge von Goroutines (M), die auf eine Menge von System-Threads (N) geplant werden.
Der Go-Scheduler arbeitet kooperativ und präemptiv:
- Eine Goroutine kann explizit die Kontrolle abgeben, indem sie
runtime.Gosched()aufruft, was anderen Goroutines die Ausführung ermöglicht. - Der Scheduler kann eine Goroutine an bestimmten Punkten unterbrechen (z.B. bei blockierenden Operationen, Systemaufrufen, Ein- und Ausgabetransaktionen).
- Das Go-Laufzeitsystem wechselt automatisch den Kontext zwischen Goroutines und speichert deren Zustand (Stack, Register).
Daher erfolgt der Wechsel zwischen Goroutines innerhalb des Go-Laufzeitsystems, und der Programmierer steuert dies in der Regel nicht direkt.
Beispiel für explizites Abgeben der Kontrolle:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // Kontrolle an andere Goroutines abgeben
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Haupt-Goroutine -", i)
}
}
Hier ermöglicht runtime.Gosched() den Wechsel zu anderen Goroutines.