Sobes.tech
Junior — Middle

Come si può controllare il numero di thread attivi in un'applicazione?

sobes.tech AI

Risposta dell'AI

In Go, per controllare il numero di thread attivi (goroutine), si utilizzano generalmente meccanismi di sincronizzazione e limitazione del parallelismo:

  • Canali con buffer come semafori: creano un canale con capacità limitata e, prima di avviare una goroutine, inviano un valore, e dopo aver terminato, ne ricevono uno, limitando così il numero di goroutine in esecuzione contemporaneamente.

  • Pacchetto sync.WaitGroup: aiuta ad aspettare che un gruppo di goroutine finisca, ma non limita il loro numero.

  • Pacchetto golang.org/x/sync/semaphore: fornisce un semaforo comodo per limitare il parallelismo.

Esempio con un canale semaforo:

sem := make(chan struct{}, 5) // massimo 5 goroutine contemporaneamente

for _, task := range tasks {
    sem <- struct{}{} // blocca se già ci sono 5 goroutine in esecuzione
    go func(t Task) {
        defer func() { <-sem }() // libera uno slot
        process(t)
    }(task)
}

// Attende che tutte le goroutine finiscano
for i := 0; i < cap(sem); i++ {
    sem <- struct{}{}
}

In questo modo, si può controllare il numero di thread attivi ed evitare un consumo eccessivo di risorse.