Go Academy · Lektion

Worker-pool-mønsteret

Begræns samtidigheden

Lektion 1 af 413 trin

Worker-pool-mønsteret er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 1 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.

Hvad er en arbejderpulje

En arbejderpulje starter et fast antal goroutiner, som alle henter opgaver fra en delt kanal. I stedet for at starte én goroutine pr. opgave starter du N arbejdere og giver dem arbejde.

  • Begrænser antallet af samtidige operationer
  • Genbruger goroutiner i stedet for at oprette tusindvis
  • Beskytter delte ressourcer som databaser eller API'er

Hvorfor begrænse samtidighed

Ubegrænsede goroutiner kan opbruge hukommelse og fildeskriptorer eller overbelaste en bagvedliggende tjeneste. En pulje giver dig en parameter til at styre, hvor meget arbejde der kører på én gang.

Hvis du har 10000 URL'er, der skal hentes, vil du ikke have 10000 samtidige HTTP-anmodninger. En pulje med 20 arbejdere holder det på et fornuftigt niveau.

Kanalen jobs

Opgaver flyder ind i kanalen jobs. Hver arbejder læser fra den i en for range-løkke. Når kanalen lukkes, slutter løkken, og arbejderen afsluttes.

jobs := make(chan int, 100)
for j := 1; j <= 5; j++ {
    jobs <- j
}
close(jobs)

Én arbejder

En arbejder er blot en funktion, der gennemløber kanalen med opgaver. Den behandler hver opgave og skriver resultatet til en resultatkanal.

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        results <- j * 2
    }
}

Start af flere arbejdere

Start puljen med en simpel løkke. Ved hver gennemløb starter du én goroutine, der kører den samme arbejderfunktion. De deler alle de samme opgave- og resultatkanaler.

for w := 1; w <= 3; w++ {
    go worker(w, jobs, results)
}

Retningsbestemte kanaltyper

Bemærk <-chan int (kun modtagelse) og chan<- int (kun afsendelse) i arbejderens signatur. Disse retningsbestemte typer lader compileren forhindre en arbejder i ved et uheld at sende til opgaver eller læse fra resultater.

Indsamling af resultater

Efter at have sendt alle opgaver og lukket kanalen læser hoved-goroutinen præcis lige så mange resultater, som der var opgaver. Det synkroniserer programmet, så det ikke afsluttes for tidligt.

sum := 0
for a := 1; a <= 5; a++ {
    sum += <-results
}
fmt.Println("total:", sum)

En komplet kørbar pulje

Her er hele mønsteret i ét program: tre arbejdere fordobler fem tal. Kør det, og se den samlede værdi.

package main

import "fmt"

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 5)
    results := make(chan int, 5)
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)
    total := 0
    for a := 1; a <= 5; a++ {
        total += <-results
    }
    fmt.Println("total:", total)
}

Bufferet kontra ubufferet

En bufferet opgavekanal lader producenten sætte arbejde i kø uden at blokere, indtil bufferen er fuld. En ubufferet kanal tvinger en overdragelse igennem: afsendelsen blokerer, indtil en arbejder er klar. Buffering udjævner producenter, der arbejder i pludselige udbrud.

Valg af puljestørrelse

Til CPU-bundet arbejde skalere du puljen til omkring runtime.NumCPU(). Til I/O-bundet arbejde (netværk, disk) kan du gå meget højere, fordi arbejderne bruger tiden på at vente i stedet for at beregne.

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Println("CPUs:", runtime.NumCPU())
}

Undgå goroutine-lækager

Hvis du glemmer at close(jobs), blokerer arbejderne for evigt på en tom kanal og lækker. Luk altid opgavekanalen, når alt arbejde er sendt ind, så for range-løkkerne afsluttes.

Hurtigt tjek

Tjek din forståelse af arbejderpuljer.

Opsamling

Du har lært mønsteret for arbejderpuljer:

  • Opret et fast antal arbejdere, der læser fra en delt kanal med opgaver
  • Brug retningsbestemte kanaltyper for at øge sikkerheden
  • Luk kanalen med opgaver for at afslutte arbejderne
  • Indsaml resultater for at synkronisere færdiggørelsen
  • Tilpas puljens størrelse efter arbejdsbelastningen (CPU eller IO)
Gratis at komme i gang

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 “Worker-pool-mønsteret” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Worker-pool-mønsteret”, 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 “Worker-pool-mønsteret”?

Begræns samtidigheden 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 1 af 4.

Hvor lang tid tager lektionen “Worker-pool-mønsteret”?

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

  1. Worker-pool-mønsteret
  2. Fan-out og fan-in
  3. Pipeline-faser
  4. Gracful nedlukning
← Tilbage til Go Academy