Junior — Middle
¿Cómo se realiza el cambio de ejecución entre diferentes goroutines en el lenguaje Go?
sobes.tech AI
Respuesta de la IA
En el lenguaje Go, el cambio de ejecución entre goroutines se realiza mediante el planificador de Go runtime, que implementa el modelo M:N — un conjunto de goroutines (M) programadas en un conjunto de hilos del sistema (N).
El planificador de Go funciona de manera cooperativa y preemptiva:
- Una goroutine puede ceder explícitamente el control llamando a
runtime.Gosched(), lo que permite que otras goroutines se ejecuten. - El planificador puede interrumpir una goroutine en puntos específicos (por ejemplo, al llamar a operaciones bloqueantes, llamadas al sistema, operaciones de entrada/salida).
- El runtime de Go cambia automáticamente el contexto entre goroutines, guardando su estado (pila, registros).
De esta forma, el cambio entre goroutines ocurre dentro del runtime de Go, y el programador generalmente no lo controla directamente.
Ejemplo de ceder explícitamente el control:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // cedemos la ejecución a otras goroutines
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Goroutine principal -", i)
}
}
Aquí, runtime.Gosched() permite cambiar a otras goroutines.