Sobes.tech
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.).