Go Academy · Lektion

Fan-Out und Fan-In

Arbeit verteilen und sammeln

Lektion 2 von 413 Schritte

Fan-Out und Fan-In ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Fan-out und Fan-in

Fan-out bedeutet, mehrere Goroutinen zu starten, die aus einem Kanal lesen und die Arbeit verteilen. Fan-in bedeutet, die Ausgaben mehrerer Goroutinen wieder in einem Kanal zusammenzuführen.

  • Fan-out verteilt die Last auf mehrere Worker
  • Fan-in führt die Ergebnisse für den Consumer zusammen

Eine Generatorstufe

Die Pipeline beginnt mit einem Generator: einer Funktion, die einen Kanal zurückgibt, Werte aus ihrer eigenen Goroutine in ihn einspeist und ihn anschließend schließt.

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

Fan-out

Für Fan-out starten Sie mehrere Goroutinen, die alle aus demselben Eingangskanal lesen. Jede führt dieselbe Verarbeitungsfunktion aus und erzeugt ihren eigenen Ausgangskanal.

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

Eine Verarbeitungsstufe

Die Stufe square liest aus in, quadriert jeden Wert und sendet ihn an einen neuen Ausgangskanal. Mehrere Instanzen dieser Stufe verwenden gemeinsam einen Eingang.

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

Fan-in mit merge

Fan-in führt mehrere Kanäle zu einem zusammen. Eine sync.WaitGroup verfolgt die Goroutinen pro Kanal, und eine schließende Goroutine wartet, bis alle beendet sind, bevor sie den zusammengeführten Ausgang schließt.

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
}

Warum die WaitGroup

Jede zusammenführende Goroutine kopiert einen Eingangskanal nach out. out darf erst geschlossen werden, wenn jeder Eingang vollständig gelesen wurde. Die WaitGroup zählt die aktiven Kopier-Goroutinen; die schließende Goroutine wird durch wg.Wait() blockiert, bis diese beendet sind.

Die Schleifenvariable erfassen

In älteren Go-Versionen muss die Closure c als Parameter übernehmen, damit jede Goroutine ihren eigenen Kanal bindet und nicht die gemeinsam genutzte Schleifenvariable. Die explizite Übergabe von c verhindert den klassischen Fehler mit Schleifenvariablen.

Ein vollständiges Fan-out und Fan-in

Dieses Programm generiert Zahlen, verteilt sie per Fan-out auf zwei square-Stufen und führt sie anschließend per Fan-in zusammen, um die zusammengeführten Ergebnisse zu summieren.

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)
}

Die Reihenfolge ist nicht garantiert

Da zwei square-Stufen gleichzeitig um denselben Eingang konkurrieren, ist die Reihenfolge der zusammengeführten Ausgabe nicht deterministisch. Wenn Sie eine bestimmte Reihenfolge benötigen, versehen Sie jedes Element mit einem Index oder verwenden Sie eine einzelne Stufe.

Wann Sie Fan-out einsetzen

Setzen Sie Fan-out ein, wenn eine Stufe der Engpass ist und sich die Arbeit parallelisieren lässt. Wenn der vorgelagerte Generator langsam ist, helfen zusätzliche nachgelagerte Worker nicht; sie würden lediglich untätig bleiben.

Backpressure

Ungepufferte Kanäle erzeugen natürliche Backpressure: Eine schnelle Stufe blockiert, wenn ein langsamer Consumer nicht mithalten kann. Dadurch wird ein unbegrenztes Speicherwachstum in der Pipeline verhindert.

Kurztest

Testen Sie Ihr Wissen über Fan-in.

Zusammenfassung

Sie haben Fan-out und Fan-in gelernt:

  • Fan-out: Mehrere Goroutinen lesen aus einem Kanal
  • Fan-in: Viele Kanäle mithilfe einer WaitGroup zu einem zusammenführen
  • Die Reihenfolge bleibt über parallele Stufen hinweg nicht erhalten
  • Ungepufferte Kanäle sorgen für Backpressure
Kostenlos starten

Lerne Go mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
51
Lektionen
203

Häufig gestellte Fragen

Ist die Lektion „Fan-Out und Fan-In“ kostenlos?

Ja — der vollständige Text von „Fan-Out und Fan-In“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Fan-Out und Fan-In“?

Arbeit verteilen und sammeln Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Fan-Out und Fan-In“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Worker-Pool-Muster
  2. Fan-Out und Fan-In
  3. Pipeline-Stufen
  4. Geordnetes Herunterfahren
← Zurück zu Go Academy