Go Academy · Lección

Patrones fan-in y fan-out

Fusión de varios channels y distribución del trabajo

Lección 3 de 413 pasos

Patrones fan-in y fan-out es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

¿Qué es fan-out?

Fan-out distribuye el trabajo de un canal entre varias goroutines, lo que permite procesarlo en paralelo. Cada worker recibe datos del mismo canal de entrada.

Ejemplo de fan-out

Inicie N workers que lean todos de un canal de trabajos compartido:

func fanOut(jobs <-chan Job, n int) {
    for i := 0; i < n; i++ {
        go func() {
            for job := range jobs {
                process(job)
            }
        }()
    }
}

¿Qué es fan-in?

Fan-in combina varios canales en uno, de modo que un único consumidor pueda leer resultados de muchos productores.

Fan-in con goroutines

Inicie una goroutine por cada canal de entrada; cada goroutine reenviará los valores a un canal de salida compartido.

func fanIn(cs ...<-chan int) <-chan int {
    out := make(chan int)
    var wg sync.WaitGroup
    for _, c := range cs {
        wg.Add(1)
        go func(ch <-chan int) {
            defer wg.Done()
            for v := range ch { out <- v }
        }(c)
    }
    go func() { wg.Wait(); close(out) }()
    return out
}

Fan-in con select

Para un número fijo de canales de entrada, un bucle select es más sencillo que utilizar una goroutine por canal.

func merge(a, b <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for a != nil || b != nil {
            select {
            case v, ok := <-a: if !ok { a = nil } else { out <- v }
            case v, ok := <-b: if !ok { b = nil } else { out <- v }
            }
        }
    }()
    return out
}

Etapa de una canalización

Combine fan-out y fan-in para crear una etapa de canalización: un canal de entrada, N workers en paralelo y un canal de salida combinado.

func parallelStage(in <-chan Work, n int) <-chan Result {
    outs := make([]<-chan Result, n)
    for i := 0; i < n; i++ {
        outs[i] = worker(in)
    }
    return fanIn(outs...)
}

Cerrar canales correctamente

El emisor cierra el canal; el receptor detecta el cierre mediante la forma de recepción de dos valores o recorriéndolo con range. Nunca cierre el canal desde el lado del receptor.

for v := range in { // exits when in is closed
    process(v)
}

Coordinación con WaitGroup

Utilice sync.WaitGroup para saber cuándo han terminado todos los workers de fan-out y, entonces, cierre el canal de salida para que puedan finalizar los consumidores posteriores.

Contrapresión

Utilice canales con búfer entre las etapas de una canalización para absorber ráfagas. Dimensione el búfer según la diferencia de latencia prevista entre el productor y el consumidor.

out := make(chan Result, 100) // buffer absorbs bursts

Propagación de errores

Incluya los resultados en una estructura que contenga tanto el valor como un error, para que los errores recorran la canalización junto con los datos sin provocar un panic.

type Result struct {
    Value int
    Err   error
}

Cancelación mediante contexto

Pase un contexto por las etapas de la canalización y compruebe ctx.Done() en cada etapa para que toda la canalización se detenga al cancelarse.

case <-ctx.Done():
    return ctx.Err()

Comprobación rápida

En un patrón fan-in, ¿qué cierra el canal de salida combinado?

Repaso: fan-in y fan-out

Puntos clave:

  • Fan-out: varios workers leen de un canal
  • Fan-in: una goroutine por origen combina los datos en un canal de salida
  • WaitGroup coordina el cierre del canal combinado
  • Utilice context para cancelar y canales con búfer para aplicar contrapresión
Gratis para empezar

Aprende Go con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Patrones fan-in y fan-out» es gratis?

Sí — el texto completo de «Patrones fan-in y fan-out» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Patrones fan-in y fan-out»?

Fusión de varios channels y distribución del trabajo Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Patrones fan-in y fan-out»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La sentencia select
  2. Tiempos de espera y tickers
  3. Patrones fan-in y fan-out
  4. Patrón de pool de workers
← Volver a Go Academy