Sobes.tech
Junior — Middle

Kako se ponaša program u jeziku Go kada je GOMAXPROCS = 1 i pokrene se gorutina sa beskonačnim ciklusom, ako u isto vreme pokušate da izvršite drugi deo koda?

sobes.tech АИ

Одговор од АИ

Postavljanjem GOMAXPROCS=1 u Go programu, broj sistemskih niti koje mogu istovremeno da rade je ograničen na jednu. Ako pokrenete gorutinu sa beskonačnim petljom bez poziva funkcija koje omogućavaju planeru da menja kontekst (npr. time.Sleep, runtime.Gosched), ta gorutina će zauzeti jedinu nit i blokirati izvršavanje drugih gorutina.

Kao rezultat, drugi deo koda koji se izvršava u drugim gorutinama neće moći da se izvršava paralelno i će čekati dok beskonačna petlja ne preda kontrolu. To je zato što planer gorutina u Go na nivou korisnika menja izvršavanje između gorutina, ali sa GOMAXPROCS=1 postoji samo jedna OS nit, i ako gorutina ne dozvoli planeru da pređe, ostale će biti blokirane.

Primer:

package main

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

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// beskonačna petlja bez yield
		}
	}()

	time.Sleep(time.Second) // dajemo vreme gorutini da pokrene

	fmt.Println("Drugi deo koda") // možda nikada neće biti izvršen
}

Da biste izbegli blokade, u beskonačnoj petlji treba ubaciti pozive koji omogućavaju planeru da pređe kontekst, kao što su runtime.Gosched() ili time.Sleep.