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.