Padrão de semáforo
Limite a concorrência com um semáforo baseado em canal
Padrão de semáforo é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
O que é um semáforo?
Um semáforo limita o número de gorrotinas que executam uma operação simultaneamente. Ele evita o esgotamento de recursos (por exemplo, conexões de banco de dados abertas demais ou requisições HTTP de saída em excesso).
Canal com buffer como semáforo
Um canal com buffer de capacidade N funciona como um semáforo contador. Adquirir envia para o canal (bloqueia quando ele está cheio); liberar recebe do canal.
sem := make(chan struct{}, 10)
func withSem(f func()) {
sem <- struct{}{} // acquire
defer func() { <-sem }() // release
f()
}Uma gorrotina por tarefa com semáforo
Inicie uma gorrotina por tarefa, mas limite a simultaneidade com um semáforo:
sem := make(chan struct{}, 5)
for _, job := range jobs {
sem <- struct{}{}
go func(j Job) {
defer func() { <-sem }()
process(j)
}(job)
}Esvaziando o semáforo ao final
Depois de iniciar todas as gorrotinas, esvazie o semáforo para garantir que todas terminem antes do retorno:
// After the loop, acquire all N slots (blocks until all goroutines release)
for i := 0; i < cap(sem); i++ {
sem <- struct{}{}
}golang.org/x/sync/semaphore
Para um semáforo ponderado (por exemplo, gorrotinas com diferentes pesos de recursos), use o tipo semaphore.Weighted:
s := semaphore.NewWeighted(100)
// acquire 10 units
if err := s.Acquire(ctx, 10); err != nil { return err }
defer s.Release(10)
// do workAquisição compatível com contexto
O método Acquire do semáforo ponderado respeita um contexto e retorna um erro se ele for cancelado antes de o semáforo ficar disponível.
TryAcquire
s.TryAcquire(n) adquire n unidades apenas se elas estiverem imediatamente disponíveis, retornando false caso contrário. É útil para verificações que não bloqueiam.
Semáforo versus conjunto de workers
Um conjunto de workers tem um grupo fixo de gorrotinas persistentes. Um semáforo permite iniciar gorrotinas sob demanda, mas limita a simultaneidade. Use um semáforo quando a taxa de chegada de tarefas variar muito.
Limitação de simultaneidade HTTP
Envolva um manipulador ou cliente HTTP com um semáforo para evitar excesso de requisições simultâneas de saída ou de gorrotinas de manipuladores de entrada.
Limitação de conexões de banco de dados
Em vez de um semáforo, defina db.SetMaxOpenConns(n) e db.SetMaxIdleConns(m) — o pacote sql gerencia internamente a simultaneidade do conjunto de conexões.
Equidade do semáforo
Semáforos baseados em canais com buffer são aproximadamente justos (FIFO para gorrotinas bloqueadas no envio), mas isso não é estritamente garantido. O pacote de semáforo ponderado oferece garantias de equidade mais rigorosas.
Verificação rápida
Como um canal com buffer implementa um semáforo?
Recapitulação: padrão de semáforo
Pontos principais:
- Canal com buffer sem := make(chan struct{}, N) para semáforos simples
- Envie para adquirir; receba para liberar; sempre adie a liberação
- golang.org/x/sync/semaphore para a variante ponderada e ciente do contexto
- Use errgroup.SetLimit para limites simples de concorrência por grupo
Perguntas Frequentes
A aula “Padrão de semáforo” é grátis?
Sim — o texto completo de “Padrão de semáforo” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “Padrão de semáforo”?
Limite a concorrência com um semáforo baseado em canal Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Padrão de semáforo”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Padrões de pipeline e estágios
- errgroup para tratamento concorrente de errors
- Padrão de semáforo
- Detecção de vazamentos e cancelamento