Sobes.tech
Junior — Middle

Cum se comportă un program în limbajul Go atunci când GOMAXPROCS este setat la 1 și se pornește o goroutine cu un ciclu infinit, dacă în același timp se încearcă executarea unei alte părți a codului?

sobes.tech AI

Răspuns de la AI

Setând GOMAXPROCS=1 într-un program Go, se limitează numărul de fire de sistem care pot funcționa simultan la unul. Dacă porniți o gorutină cu un ciclu infinit fără a apela funcții care permit planificatorului să schimbe contextul (de exemplu, time.Sleep, runtime.Gosched), acea gorutină va ocupa singurul fir și va bloca execuția altor gorutine.

Ca rezultat, o altă parte a codului executată în alte gorutine nu va putea fi executată în paralel și va aștepta ca ciclul infinit să cedeze controlul. Acest lucru se datorează faptului că planificatorul gorutinelor Go, la nivel de utilizator, schimbă execuția între gorutine, dar cu GOMAXPROCS=1 există doar un fir OS, iar dacă gorutina nu permite planificatorului să schimbe, celelalte sunt blocate.

Exemplu:

package main

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

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// ciclu infinit fără yield
		}
	}()

	time.Sleep(time.Second) // dăm timp gorutinei să pornească

	fmt.Println("Altă parte a codului") // poate niciodată să nu fie executată
}

Pentru a evita blocajele, în bucla infinită trebuie inserate apeluri care permit planificatorului să schimbe contextul, cum ar fi runtime.Gosched() sau time.Sleep.