ExpertiDict

Go · Avançado · Português · Técnico

semáforo com channel

/seˈma.fo.ɾu kõ ˈtʃɛ.new/substantivo

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

Veja também

Todos os termos de Go