Sobes.tech
Junior — Middle

Comment se comporte un programme en langage Go lorsque GOMAXPROCS est défini sur 1 et qu'une goroutine avec une boucle infinie est lancée, si en même temps on essaie d'exécuter une autre partie du code?

sobes.tech IA

Réponse de l'IA

En définissant GOMAXPROCS=1 dans un programme Go, le nombre de threads système pouvant fonctionner simultanément est limité à un. Si vous lancez une goroutine avec une boucle infinie sans appeler de fonctions permettant au planificateur de changer de contexte (par exemple, time.Sleep, runtime.Gosched), cette goroutine occupera le seul thread et bloquera l'exécution des autres goroutines.

En conséquence, une autre partie du code exécutée dans d'autres goroutines ne pourra pas s'exécuter en parallèle et attendra que la boucle infinie cède le contrôle. Cela est dû au fait que le planificateur de goroutines de Go, au niveau utilisateur, change l'exécution entre goroutines, mais avec GOMAXPROCS=1, il n'y a qu'un seul thread OS, et si la goroutine ne permet pas au planificateur de changer, les autres sont bloquées.

Exemple :

package main

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

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// boucle infinie sans yield
		}
	}()

	time.Sleep(time.Second) // on donne le temps à la goroutine de démarrer

	fmt.Println("Une autre partie du code") // peut ne jamais s'exécuter
}

Pour éviter le blocage, il faut insérer dans la boucle infinie des appels permettant au planificateur de changer de contexte, comme runtime.Gosched() ou time.Sleep.