0Pricing
Go Academy · Lektion

Worker-Pool-Muster

Nebenläufigkeit begrenzen

Worker-Pool-Muster ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 1 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.

Was ist ein Worker-Pool

Ein Worker-Pool startet eine feste Anzahl von Goroutinen, die alle Jobs aus einem gemeinsamen Channel holen. Statt eine Goroutine pro Aufgabe zu starten, starten Sie N Worker und versorgen sie mit Arbeit.

  • Begrenzt die Anzahl gleichzeitiger Vorgänge
  • Verwendet Goroutinen wieder, statt Tausende zu erstellen
  • Schützt gemeinsam genutzte Ressourcen wie Datenbanken oder APIs

Warum die Nebenläufigkeit begrenzen

Eine unbegrenzte Anzahl von Goroutinen kann den Speicher oder Dateideskriptoren erschöpfen oder einen nachgelagerten Dienst überlasten. Ein Pool gibt Ihnen einen Stellhebel, mit dem Sie kontrollieren können, wie viel Arbeit gleichzeitig ausgeführt wird.

Wenn Sie 10000 URLs abrufen müssen, möchten Sie nicht 10000 gleichzeitige HTTP-Anfragen senden. Ein Pool mit 20 Workern hält das in einem vernünftigen Rahmen.

Der jobs-Channel

Jobs fließen in einen jobs-Channel. Jeder Worker liest in einer for range-Schleife daraus. Wenn der Channel geschlossen wird, endet die Schleife und der Worker wird beendet.

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

Ein einzelner Worker

Ein Worker ist einfach eine Funktion, die den jobs-Channel durchläuft. Er verarbeitet jeden Job und schreibt das Ergebnis in einen results-Channel.

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

Mehrere Worker starten

Starten Sie den Pool mit einer einfachen Schleife. Jede Iteration startet eine Goroutine, die dieselbe Worker-Funktion ausführt. Alle teilen sich denselben jobs- und results-Channel.

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

Unidirektionale Channel-Typen

Beachten Sie <-chan int (nur empfangend) und chan<- int (nur sendend) in der Worker-Signatur. Diese unidirektionalen Typen ermöglichen es dem Compiler, einen Worker daran zu hindern, versehentlich in jobs zu senden oder aus results zu lesen.

Ergebnisse sammeln

Nachdem alle Jobs übergeben und der Channel geschlossen wurde, liest die Haupt-Goroutine genau so viele Ergebnisse, wie es Jobs gab. Dadurch wird das Programm synchronisiert und beendet sich nicht vorzeitig.

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

Ein vollständiger ausführbarer Pool

Hier ist das vollständige Pattern in einem Programm: Drei Worker verdoppeln fünf Zahlen. Führen Sie es aus und beobachten Sie die Gesamtsumme.

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

Gepuffert oder ungepuffert

Ein gepufferter jobs-Channel ermöglicht es dem Produzenten, Arbeit einzureihen, ohne blockiert zu werden, bis der Puffer voll ist. Ein ungepufferter Channel erzwingt eine direkte Übergabe: Das Senden blockiert, bis ein Worker bereit ist. Pufferung gleicht stoßweise arbeitende Produzenten aus.

Die Poolgröße bestimmen

Für CPU-intensive Arbeit sollten Sie die Poolgröße nahe an runtime.NumCPU() wählen. Für IO-intensive Arbeit (Netzwerk, Datenträger) können Sie sie deutlich höher wählen, da die Worker Zeit mit Warten statt mit Berechnen verbringen.

package main

import (
    "fmt"
    "runtime"
)

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

Goroutine-Leaks vermeiden

Wenn Sie close(jobs) vergessen, blockieren Worker für immer an einem leeren Channel und verursachen ein Leak. Schließen Sie den jobs-Channel immer, sobald alle Arbeiten übergeben wurden, damit die for range-Schleifen enden.

Kurztest

Testen Sie Ihr Verständnis von Worker-Pools.

Zusammenfassung

Sie haben das Worker-Pool-Muster gelernt:

  • Eine feste Anzahl von Workern starten, die aus einem gemeinsam genutzten Jobs-Kanal lesen
  • Gerichtete Kanaltypen für mehr Sicherheit verwenden
  • Den Jobs-Kanal schließen, um die Worker zu beenden
  • Ergebnisse sammeln, um den Abschluss zu synchronisieren
  • Die Größe des Pools an die Art der Arbeitslast anpassen (CPU oder E/A)

Häufig gestellte Fragen

Ist die Lektion „Worker-Pool-Muster“ kostenlos?

Ja — der vollständige Text von „Worker-Pool-Muster“ 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 „Worker-Pool-Muster“?

Nebenläufigkeit begrenzen 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 1 von 4.

Wie lange dauert die Lektion „Worker-Pool-Muster“?

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