Sobes.tech
Junior — Middle

Come determinare il limite del numero di goroutine eseguite contemporaneamente nel linguaggio Go?

sobes.tech AI

Risposta dell'AI

Nel linguaggio Go non esiste un meccanismo integrato per limitare direttamente il numero di goroutine in esecuzione contemporaneamente. Tuttavia, per controllare il limite di parallelismo, si utilizzano generalmente semafori o canali con capacità limitata.

Esempio di limitazione del numero di goroutine in esecuzione contemporaneamente usando un canale:

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    sem <- struct{}{} // acquisisci uno slot
    fmt.Printf("Goroutine %d ha iniziato\n", id)
    time.Sleep(time.Second) // simulazione di lavoro
    fmt.Printf("Goroutine %d ha terminato\n", id)
    <-sem // rilascia lo slot
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // canale con buffer limita il numero di goroutine
    var wg sync.WaitGroup

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

In questo esempio, il canale sem con buffer di maxGoroutines limita il numero di goroutine che possono essere eseguite contemporaneamente. Ogni goroutine, prima di iniziare il lavoro, inserisce una struttura vuota nel canale, occupando uno slot, e la rilascia dopo aver terminato. In questo modo, al massimo maxGoroutines goroutine lavoreranno contemporaneamente.