Sobes.tech
Junior — Middle

Como é que se pode controlar o número de threads ativas numa aplicação?

sobes.tech IA

Resposta da IA

Em Go, para controlar o número de threads ativos (goroutines), geralmente utilizam-se mecanismos de sincronização e limitação do paralelismo:

  • Canais com buffer como semáforos: criam um canal com capacidade limitada e, antes de iniciar uma goroutine, enviam um valor para ele, e após terminar, recebem um, limitando assim o número de goroutines que podem estar em execução simultânea.

  • Pacote sync.WaitGroup: ajuda a esperar que um grupo de goroutines termine, mas não limita seu número.

  • Pacote golang.org/x/sync/semaphore: fornece um semáforo conveniente para limitar o paralelismo.

Exemplo usando um canal semáforo:

sem := make(chan struct{}, 5) // máximo de 5 goroutines ao mesmo tempo

for _, task := range tasks {
    sem <- struct{}{} // bloqueia se já houver 5 goroutines em execução
    go func(t Task) {
        defer func() { <-sem }() // libera uma vaga
        process(t)
    }(task)
}

// Espera até que todas as goroutines terminem
for i := 0; i < cap(sem); i++ {
    sem <- struct{}{}
}

Dessa forma, é possível controlar o número de threads ativas e evitar consumo excessivo de recursos.