Senior
¿Puedes contarme sobre el patrón Semaphore?
sobes.tech AI
Respuesta de la IA
El patrón Semaphore ( semáforo) es un mecanismo de sincronización que limita la cantidad de operaciones que se ejecutan simultáneamente o el acceso a un recurso.
En Go, un semáforo se puede implementar mediante un canal, limitando la cantidad de goroutines que pueden ejecutar una sección crítica al mismo tiempo.
Ejemplo de un semáforo simple en Go:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
sem := make(chan struct{}, 3) // semáforo con capacidad de 3
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // adquisición del semáforo
fmt.Printf("Goroutine %d comenzó a trabajar\n", id)
time.Sleep(1 * time.Second) // simulación de trabajo
fmt.Printf("Goroutine %d terminó de trabajar\n", id)
<-sem // liberación del semáforo
}(i)
}
wg.Wait()
}
En este ejemplo, no más de tres goroutines pueden realizar trabajo simultáneamente. El semáforo es útil para limitar el paralelismo, por ejemplo, cuando se trabaja con recursos limitados (conexiones, archivos, etc.).