0Pricing
Go Academy · Lección

Fan-Out y Fan-In

Distribuya y recopile el trabajo

Fan-Out y Fan-In es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 2 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.

Fan-out y fan-in

Fan-out significa iniciar varias goroutines que lean de un canal y distribuyan el trabajo. Fan-in significa combinar las salidas de varias goroutines en un solo canal.

  • Fan-out distribuye la carga entre los workers
  • Fan-in consolida los resultados para el consumidor

Una etapa generadora

El pipeline comienza con un generador: una función que devuelve un canal y le proporciona valores desde su propia goroutine; después, lo cierra.

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

Realizar fan-out

Para realizar fan-out, inicie varias goroutines que lean del mismo canal de entrada. Cada una ejecuta la misma función de procesamiento y produce su propio canal de salida.

in := gen(1, 2, 3, 4, 5)
c1 := square(in)
c2 := square(in)

Una etapa de procesamiento

La etapa square lee de in, eleva al cuadrado cada valor y lo envía a un nuevo canal de salida. Varias instancias de esta etapa comparten una entrada.

func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

Realizar fan-in con merge

Fan-in combina varios canales en uno solo. Un sync.WaitGroup realiza el seguimiento de las goroutines asociadas a cada canal, y una goroutine encargada del cierre espera a que todas terminen antes de cerrar la salida combinada.

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

Por qué se usa WaitGroup

Cada goroutine de combinación copia un canal de entrada en out. No debemos cerrar out hasta vaciar todas las entradas. WaitGroup cuenta los copiadores activos; la goroutine encargada del cierre se bloquea en wg.Wait() hasta que terminan.

Capturar la variable del bucle

En las versiones antiguas de Go, la clausura debe recibir c como parámetro para que cada goroutine vincule su propio canal, en lugar de la variable compartida del bucle. Pasar c explícitamente evita el error clásico de la variable del bucle.

Un fan-out y fan-in completo

Este programa genera números, realiza fan-out hacia dos etapas square y después hace fan-in para sumar los resultados combinados.

package main

import (
    "fmt"
    "sync"
)

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() { for _, n := range nums { out <- n }; close(out) }()
    return out
}

func square(in <-chan int) <-chan int {
    out := make(chan int)
    go func() { for n := range in { out <- n * n }; close(out) }()
    return out
}

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

func main() {
    in := gen(1, 2, 3, 4, 5)
    c1 := square(in)
    c2 := square(in)
    total := 0
    for n := range merge(c1, c2) {
        total += n
    }
    fmt.Println("sum of squares:", total)
}

El orden no está garantizado

Como las dos etapas square compiten por la misma entrada, el orden de salida combinada es no determinista. Si necesita conservar el orden, asocie un índice a cada elemento o use una sola etapa.

Cuándo realizar fan-out

Realice fan-out cuando una etapa sea el cuello de botella y el trabajo se pueda paralelizar. Si el generador ascendente es lento, añadir más workers descendentes no ayudará; simplemente se quedarán sin trabajo.

Contrapresión

Los canales sin búfer crean una contrapresión natural: una etapa rápida se bloquea cuando un consumidor lento no puede mantener el ritmo. Esto evita que la memoria crezca sin límites a lo largo del pipeline.

Comprobación rápida

Compruebe cuánto sabe sobre fan-in.

Recapitulación

Ha aprendido fan-out y fan-in:

  • Fan-out: varias goroutines leen de un canal
  • Fan-in: combina muchos canales en uno mediante WaitGroup
  • El orden no se conserva entre etapas paralelas
  • Los canales sin búfer proporcionan contrapresión

Preguntas frecuentes

¿La lección «Fan-Out y Fan-In» es gratis?

Sí — el texto completo de «Fan-Out y Fan-In» 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 «Fan-Out y Fan-In»?

Distribuya y recopile el 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 2 de 4.

¿Cuánto tiempo toma la lección «Fan-Out y Fan-In»?

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. Patrón de grupo de trabajadores
  2. Fan-Out y Fan-In
  3. Etapas de pipeline
  4. Cierre ordenado
← Volver a Go Academy