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.