Senior
Fala-me sobre o padrão Semaphore.
sobes.tech IA
Resposta da IA
O padrão Semaphore (semáforo) é um mecanismo de sincronização que limita o número de operações que podem ser executadas simultaneamente ou o acesso a um recurso.
Em Go, um semáforo pode ser implementado usando um canal, limitando o número de goroutines que podem executar uma seção crítica ao mesmo tempo.
Exemplo de um semáforo simples em Go:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
sem := make(chan struct{}, 3) // semáforo com capacidade de 3
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // aquisição do semáforo
fmt.Printf("Goroutine %d começou a trabalhar\n", id)
time.Sleep(1 * time.Second) // simulação de trabalho
fmt.Printf("Goroutine %d terminou de trabalhar\n", id)
<-sem // liberação do semáforo
}(i)
}
wg.Wait()
}
Neste exemplo, no máximo três goroutines podem realizar trabalho ao mesmo tempo. O semáforo é útil para limitar o paralelismo, por exemplo, ao trabalhar com recursos limitados (conexões, arquivos, etc.).