Sobes.tech
Junior — Middle

¿Cómo se comporta un programa en el lenguaje Go cuando se establece GOMAXPROCS = 1 y se inicia una gorutina con un ciclo infinito, si al mismo tiempo se intenta ejecutar otra parte del código?

sobes.tech AI

Respuesta de la IA

Al establecer GOMAXPROCS=1 en un programa de Go, se limita la cantidad de hilos del sistema que pueden estar en ejecución simultáneamente a uno. Si se inicia una goroutine con un ciclo infinito sin llamar a funciones que permitan al planificador cambiar de contexto (por ejemplo, time.Sleep, runtime.Gosched), esa goroutine ocupará el único hilo y bloqueará la ejecución de otras goroutines.

Como resultado, otra parte del código ejecutada en otras goroutines no podrá ejecutarse en paralelo y esperará a que el ciclo infinito ceda el control. Esto se debe a que el planificador de goroutines de Go, a nivel de usuario, cambia la ejecución entre goroutines, pero con GOMAXPROCS=1 solo hay un hilo del sistema operativo, y si la goroutine no permite que el planificador cambie, las demás se bloquean.

Ejemplo:

package main

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

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// ciclo infinito sin yield
		}
	}()

	time.Sleep(time.Second) // damos tiempo a la goroutine para que inicie

	fmt.Println("Otra parte del código") // puede que nunca se ejecute
}

Para evitar bloqueos, en el ciclo infinito se deben insertar llamadas que permitan al planificador cambiar de contexto, como runtime.Gosched() o time.Sleep.