Sobes.tech
Junior — Middle

Kādas sekas tas radīs programmas darbībā, ja GOMAXPROCS tiks iestatīts uz 1 un tiks palaista bezgalīga goroutine?

sobes.tech AI

Atbilde no AI

Iestatot GOMAXPROCS uz 1 ierobežo Go plānotāja izmantoto operētājsistēmas pavedienu skaitu līdz vienam pavedienam. Šajā scenārijā, ja tiek palaista bezgalīga gorutīna:

  • Visas aprēķini tiks veikti secīgi vienā pavedienā.
  • Ja bezgalīgā gorutīna nesatur punktus, kuros notiek konteksta pārslēgšana (piemēram, bloķējošu operāciju vai runtime.Gosched() izsaukumu dēļ), citas gorutinas var nesaņemt izpildes laiku, kas novedīs pie programmas "sasalšanas".
  • Rezultātā programma var pārtraukt atbildēt vai darboties ļoti lēni, jo plānotājs nevar efektīvi pārslēgties starp gorutīnām.

Piemērs:

package main

import (
    "runtime"
    "time"
    "fmt"
)

func main() {
    runtime.GOMAXPROCS(1)

    go func() {
        for {
            // bezgalīga cilpa bez `runtime.Gosched()` izsaukuma
        }
    }()

    time.Sleep(time.Second)
    fmt.Println("Programma pabeigta")
}

Šajā piemērā galvenā gorutina var nesagaidīt izpildes laiku, ja bezgalīgā gorutina neatsauc kontroli, kas novedīs pie programmas "sasalšanas".