Junior — Middle
Hoe wordt de uitvoering tussen verschillende goroutines in de programmeertaal Go uitgevoerd?
sobes.tech AI
Antwoord van AI
In de programmeertaal Go wordt de uitvoering tussen goroutines geregeld door de Go runtime scheduler, dat het M:N-model implementeert — een verzameling goroutines (M) die worden gepland op een verzameling systeemthreads (N).
De Go scheduler werkt coöperatief en preëmptief:
- Een goroutine kan expliciet de controle overdragen door
runtime.Gosched()aan te roepen, waardoor andere goroutines kunnen worden uitgevoerd. - De scheduler kan een goroutine onderbreken op bepaalde punten (bijvoorbeeld bij blokkerende operaties, systeemoproepen, invoer/uitvoer operaties).
- De Go runtime wisselt automatisch van context tussen goroutines en slaat hun toestand op (stack, registers).
Zo vindt de overgang tussen goroutines plaats binnen de Go runtime, en de programmeur heeft hier meestal geen directe controle over.
Voorbeeld van expliciete controle-overdracht:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // overschakelen naar andere goroutines
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Hoofdgoroutine -", i)
}
}
Hier maakt runtime.Gosched() het mogelijk om over te schakelen naar andere goroutines.