Sobes.tech
Junior — Middle

È possibile impostare un limite al numero di thread che lavorano contemporaneamente nel linguaggio Go?

sobes.tech AI

Risposta dell'AI

In Go non esiste un meccanismo integrato per limitare direttamente il numero di goroutine (fili di esecuzione leggeri) che funzionano contemporaneamente. Potrebbero esserci molte goroutine, e sono leggere. Per limitare il numero di goroutine che vengono eseguite contemporaneamente, si usano 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{}{} // Riserva uno slot
    fmt.Printf("Lavoratore %d avviato\n", id)
    time.Sleep(time.Second) // Lavoro
    fmt.Printf("Lavoratore %d terminato\n", id)
    <-sem // Rilascia lo slot
}

func main() {
    const maxConcurrent = 3
    sem := make(chan struct{}, maxConcurrent) // Canale con limite
    var wg sync.WaitGroup

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

    wg.Wait()
}

Qui, il canale sem con buffer di maxConcurrent limita il numero di goroutine in esecuzione contemporaneamente a 3.