Sobes.tech
Junior — Middle

È possibile impostare un limite al numero di goroutine eseguite contemporaneamente in un programma?

sobes.tech AI

Risposta dell'AI

Nel linguaggio Go non esiste un meccanismo integrato per impostare un limite rigido al numero di goroutine avviate contemporaneamente. Potrebbero esserci molte goroutine, e la loro pianificazione e commutazione sono gestite dal runtime di Go.

Tuttavia, se si desidera limitare il numero di goroutine che vengono eseguite contemporaneamente (ad esempio, per controllare l’utilizzo delle risorse), si possono usare semafori o canali per limitare il parallelismo.

Esempio di limitazione del numero di goroutine che lavorano contemporaneamente usando un canale:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // acquisizione risorsa
    fmt.Printf("Goroutine %d ha iniziato a lavorare\n", id)
    // ... lavoro ...
    fmt.Printf("Goroutine %d ha finito di lavorare\n", id)
    <-sem // rilascio risorsa
}

func main() {
    const maxGoroutines = 5
    sem := make(chan struct{}, maxGoroutines)
    var wg sync.WaitGroup

    for i := 0; i < 20; i++ {
        wg.Add(1)
        go worker(i, sem, &wg)
    }

    wg.Wait()
}

In questo esempio, non ci saranno più di 5 goroutine che lavorano contemporaneamente.