Sobes.tech
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.