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