¿Qué hace go-concurrency-patterns?
Domina la concurrencia en Go con goroutines, canales, primitivas de sincronización y contextos. Útil al construir aplicaciones concurrentes en Go, implementar grupos de workers o depurar condiciones de carrera.
Patrones clave
1. Goroutines y canales básicos
- Crea goroutines con
go func()y comunícate mediante canales. - Usa canales con buffer para desacoplar productores y consumidores.
2. Primitivas de sincronización
sync.WaitGroup: Espera a que un grupo de goroutines finalice.sync.Mutexysync.RWMutex: Protege secciones críticas contra acceso concurrente.sync.Once: Ejecuta una función exactamente una vez, incluso desde múltiples goroutines.sync.Pool: Reutiliza objetos para reducir la presión del recolector de basura.
3. Patrón Worker Pool
- Limita el número de goroutines concurrentes usando un canal de trabajos y un grupo de workers.
- Ejemplo:
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
results <- j * 2
}
}
4. Contextos (context package)
- Pasa plazos, cancelaciones y valores a través de la cadena de llamadas.
- Usa
context.WithCancel,context.WithTimeoutocontext.WithDeadlinepara controlar la vida de las goroutines.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
5. Pipeline de canales
- Encadena etapas de procesamiento usando canales de solo lectura/escritura.
- Patrón común:
generator -> filter -> collector.
6. Depuración de condiciones de carrera
- Ejecuta tus pruebas con
go test -racepara detectar accesos concurrentes inseguros. - Usa
sync/atomicpara operaciones atómicas sin bloqueo.
Consejos de uso
- Prefiere canales sobre variables compartidas cuando sea posible.
- Siempre cierra los canales desde el lado del productor.
- Usa
selectcon un canal de señalización (por ejemplo,done) para cancelaciones limpias. - Para alto rendimiento, considera el uso de
sync.Pooly evita bloqueos innecesarios.
Compatibilidad
- Go 1.14+
- Funciona con cualquier editor o IDE compatible con Go (VS Code, GoLand, Vim).
- Se integra con las herramientas estándar de Go:
go vet,go test -race.