Junior — Middle
Kokios bus pasekmės programos veikimui, jei GOMAXPROCS nustatytas į 1 ir paleidžiama begalinė goroutine?
sobes.tech AI
Atsakymas iš AI
Nustatymas GOMAXPROCS į 1 riboja Go planuotojo galimų naudoti operacinės sistemos gijų skaičių iki vienos gijos. Jei šiame scenarijuje paleidžiama begalinė gorutina:
- Visi skaičiavimai bus vykdomi sekuenčiai vienoje gijoje.
- Jei begalinė gorutina neturi taškų, kuriuose įvyksta konteksto perjungimas (pvz., užblokavimo operacijų iškvietimai arba
runtime.Gosched()), kitos gorutinos gali nesulaukti vykdymo laiko, kas sukels programos "užšalimą". - Dėl to programa gali nustoti reaguoti arba veikti labai lėtai, nes planuotojas negalės efektyviai perjungti tarp gorutinos.
Pavyzdys:
package main
import (
"runtime"
"time"
"fmt"
)
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
// begalinė ciklas be `runtime.Gosched()` iškvietimo
}
}()
time.Sleep(time.Second)
fmt.Println("Programa baigta")
}
Šiame pavyzdyje pagrindinė gorutina gali nesulaukti vykdymo laiko, jei begalinė gorutina neperduoda kontrolės, kas sukels programos "užšalimą".