Fan-Out und Fan-In
Arbeit verteilen und sammeln
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
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
- Worker-Pool-Muster
- Fan-Out und Fan-In
- Pipeline-Stufen
- Geordnetes Herunterfahren