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.