Sobes.tech
Junior — Middle

Milyen következményei lesznek a program működésére, ha a GOMAXPROCS értéke 1-re van állítva, és egy végtelen goroutine-t indítunk?

sobes.tech MI

Válasz az MI-től

Az GOMAXPROCS beállítása 1-re korlátozza a Go ütemező által használható operációs rendszer szálak számát egy szálra. Ebben a szcenárióban, ha végtelen gorutina indul:

  • Minden számítás szekvenciálisan történik egy szálon.
  • Ha a végtelen gorutina nem tartalmaz olyan pontokat, ahol kontextusváltás történik (például blokkoló műveletek vagy runtime.Gosched() hívások), akkor más gorutinok nem kaphatnak futási időt, ami a program "lefagyásához" vezet.
  • Ennek eredményeként a program nem fog válaszolni vagy nagyon lassan működik, mivel az ütemező nem tud hatékonyan váltani a gorutinok között.

Példa:

package main

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

func main() {
    runtime.GOMAXPROCS(1)

    go func() {
        for {
            // végtelen ciklus `runtime.Gosched()` hívás nélkül
        }
    }()

    time.Sleep(time.Second)
    fmt.Println("A program befejeződött")
}

Ebben a példában a fő gorutin nem kaphat időt a végrehajtásra, ha a végtelen gorutina nem adja át az irányítást, ami a program "lefagyásához" vezet.