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