Hoe gedraagt een programma in de Go-taal zich wanneer GOMAXPROCS op 1 is ingesteld en een goroutine met een oneindige lus wordt gestart, als je tegelijkertijd probeert een ander deel van de code uit te voeren?
sobes.tech AI
Antwoord van AI
Door GOMAXPROCS=1 in te stellen in een Go-programma, wordt het aantal systeemthreads dat gelijktijdig kan werken beperkt tot één. Als je een goroutine start met een oneindige lus zonder functies aan te roepen die de scheduler toestaan van context te wisselen (bijvoorbeeld time.Sleep, runtime.Gosched), dan zal deze goroutine het enige thread bezetten en de uitvoering van andere goroutines blokkeren.
Als gevolg hiervan kan een ander deel van de code dat in andere goroutines wordt uitgevoerd niet parallel worden uitgevoerd en wacht tot de oneindige lus de controle overdraagt. Dit komt doordat de Go goroutine scheduler op gebruikersniveau de uitvoering tussen goroutines wisselt, maar bij GOMAXPROCS=1 is er slechts één OS-thread, en als de goroutine geen mogelijkheid biedt aan de scheduler om te wisselen, worden de anderen geblokkeerd.
Voorbeeld:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
// oneindige lus zonder yield
}
}()
time.Sleep(time.Second) // geef tijd aan de goroutine om te starten
fmt.Println("Een ander deel van de code") // wordt misschien nooit uitgevoerd
}
Om blokkades te voorkomen, moeten in de oneindige lus aanroepen worden gedaan die de scheduler in staat stellen te wisselen, zoals runtime.Gosched() of time.Sleep.