Fan-out og fan-in
Distribuér og indsaml arbejde
Fan-out og fan-in er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.
Forgrening og sammenføring
Forgrening betyder, at du starter flere gorutiner, som læser fra én kanal og fordeler arbejdet. Sammenføring betyder, at du samler outputtet fra flere gorutiner i én kanal igen.
- Forgrening fordeler belastningen på arbejderne
- Sammenføring samler resultaterne til modtageren
Et generatortrin
Behandlingskæden starter med en generator: en funktion, der returnerer en kanal og sender værdier ind i den fra sin egen gorutine, hvorefter den lukkes.
func gen(nums ...int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
return out
}Forgrening
Du laver en forgrening ved at starte flere gorutiner, som alle læser fra den samme indgangskanal. Hver gorutine kører den samme behandlingsfunktion og producerer sin egen udgangskanal.
in := gen(1, 2, 3, 4, 5)
c1 := square(in)
c2 := square(in)Et behandlingstrin
Trinnet square læser fra in, opløfter hver værdi til anden potens og sender den til en ny udgangskanal. Flere instanser af dette trin deler én indgang.
func square(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}Sammenføring med merge
Sammenføring samler flere kanaler i én. En sync.WaitGroup holder styr på gorutinerne for hver kanal, og en gorutine til lukning venter på dem alle, før den lukkede udgang lukkes.
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
}Hvorfor WaitGroup
Hver gorutine til sammenføring kopierer én indgangskanal til out. Du må ikke lukke out, før alle indgangskanaler er tømt. WaitGroup tæller de aktive kopieringsgorutiner, og gorutinen til lukning blokerer på wg.Wait(), indtil de er færdige.
Indfangning af løkkevariablen
I ældre versioner af Go skal lukningen tage c som parameter, så hver gorutine knytter sin egen kanal til sig i stedet for den delte løkkevariabel. Ved at sende c eksplicit med undgår du den klassiske fejl med løkkevariablen.
En komplet forgrening og sammenføring
Dette program genererer tal, laver en forgrening til to kvadreringstrin og sammenfører derefter resultaterne, før de lægges sammen.
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)
}Rækkefølgen er ikke garanteret
Da de to kvadreringstrin konkurrerer om den samme indgang, er rækkefølgen af det sammenførte output ikke-deterministisk. Hvis du har brug for en bestemt rækkefølge, kan du knytte et indeks til hvert element eller bruge ét enkelt trin.
Hvornår skal du lave en forgrening
Lav en forgrening, når et trin er flaskehalsen, og arbejdet kan udføres parallelt. Hvis generatoren opstrøms er langsom, hjælper det ikke at tilføje flere arbejdere nedstrøms; de kommer bare til at mangle arbejde.
Modtryk
Ubuffrede kanaler skaber et naturligt modtryk: Et hurtigt trin blokerer, når en langsom modtager ikke kan følge med. Det forhindrer, at hukommelsesforbruget vokser uden grænse i hele behandlingskæden.
Hurtigt tjek
Tjek din viden om sammenføring.
Opsamling
Du har lært om forgrening og sammenføring:
- Forgrening: flere gorutiner læser fra én kanal
- Sammenføring: mange kanaler samles i én via WaitGroup
- Rækkefølgen bevares ikke på tværs af parallelle trin
- Ubuffrede kanaler giver modtryk
Lær Go med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Fan-out og fan-in” gratis?
Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Fan-out og fan-in”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Fan-out og fan-in”?
Distribuér og indsaml arbejde Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Go Academy?
Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Fan-out og fan-in”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Go Academy-lektion?
Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Worker-pool-mønsteret
- Fan-out og fan-in
- Pipeline-faser
- Gracful nedlukning