Go · Avançado · Português · Técnico
semáforo com channel
Técnica de limitar a concorrência usando um channel com buffer como contador: enviar ocupa uma vaga e receber libera. Impede que muitas goroutines rodem ao mesmo tempo.
Onde usar
Útil para limitar chamadas simultâneas a uma API ou ao banco sem montar um worker pool completo. O tamanho do buffer é o número máximo de execuções paralelas.
Em código
sem := make(chan struct{}, 3) // até 3 juntas
for _, t := range tarefas {
sem <- struct{}{} // ocupa vaga
go func() {
defer func() { <-sem }() // libera
fazer(t)
}()
}Exemplos
Usei um semáforo com channel para limitar a cinco downloads simultâneos.
O buffer do channel define quantas goroutines passam ao mesmo tempo.
Cuidado
Esquecer de liberar a vaga, em especial em caminhos de erro, segura o semáforo para sempre; use defer.
Sinônimos
limitador de concorrência