Junior — Middle
¿Cómo determinar el límite en la cantidad de goroutines que se ejecutan simultáneamente en el lenguaje Go?
sobes.tech AI
Respuesta de la IA
En el lenguaje Go no existe un mecanismo incorporado para limitar directamente la cantidad de goroutines que se ejecutan simultáneamente. Sin embargo, para controlar el límite de paralelismo, generalmente se utilizan semáforos o canales con capacidad limitada.
Ejemplo de restricción de la cantidad de goroutines que se ejecutan simultáneamente usando un canal:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // adquirir un espacio
fmt.Printf("Goroutine %d comenzó a trabajar\n", id)
time.Sleep(time.Second) // simulación de trabajo
fmt.Printf("Goroutine %d terminó de trabajar\n", id)
<-sem // liberar un espacio
}
func main() {
const maxGoroutines = 3
sem := make(chan struct{}, maxGoroutines) // canal con búfer limita la cantidad de goroutines
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
En este ejemplo, el canal sem con un búfer de maxGoroutines limita la cantidad de goroutines que se ejecutan simultáneamente. Cada goroutine, antes de comenzar a trabajar, coloca una estructura vacía en el canal, ocupando un espacio, y la libera después de terminar. De esta manera, no más de maxGoroutines goroutines trabajarán al mismo tiempo.