Sobes.tech
Junior — Middle

Ako se program v jeziku Go obnaša, ko je GOMAXPROCS nastavljen na 1 i pokrene se gorutina s beskonačnim ciklusom, ako u isto vreme pokušate da izvršite drugi deo koda?

sobes.tech AI

Odpoveď od AI

Nastavením GOMAXPROCS=1 v programe Go sa obmedzuje početný počet systémových vlákien, ktoré môžu súčasne bežať, na jedno. Ak spustíte gorutinu s nekonečným cyklom bez volania funkcií, ktoré umožňujú plánovaču prepínať kontext (napríklad time.Sleep, runtime.Gosched), táto gorutina zaberie jediný vlákno a zablokuje vykonávanie iných gorutín.

Výsledkom je, že iná časť kódu spustená v iných gorutinách sa nemôže vykonávať paralelne a bude čakať, kým nekonečný cyklus neodovzdá riadenie. To je spôsobené tým, že plánovač gorutín v Go na úrovni používateľa prepína vykonávanie medzi gorutinami, ale pri GOMAXPROCS=1 je k dispozícii iba jedno OS vlákno, a ak gorutina neumožní plánovaču prepínať, ostatné sú zablokované.

Príklad:

package main

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

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// nekonečný cyklus bez yield
		}
	}()

	time.Sleep(time.Second) // dáme čas gorutine na spustenie

	fmt.Println("Iná časť kódu") // môže nikdy nebežať
}

Aby ste predišli blokovaniu, v nekonečnom cykle je potrebné vložiť volania, ktoré umožnia plánovaču prepínať, napríklad runtime.Gosched() alebo time.Sleep.