Sobes.tech
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ą".