0Pricing
Go Academy · Lektion

Leak-Erkennung und Abbruch

Sicherstellen, dass Goroutines beendet werden, und Leaks verhindern

Leak-Erkennung und Abbruch ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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 Goroutine-Leak?

Ein Goroutine-Leak tritt auf, wenn eine Goroutine gestartet wird, aber nie beendet wird. Geleakte Goroutinen sammeln sich mit der Zeit an und verbrauchen Stack-Speicher und CPU, bis der Prozess beendet wird.

Häufiges Leak: blockierter Channel-Empfang

Eine Goroutine, die auf einen Channel-Empfang wartet, für den nie ein Wert eintrifft, bleibt für immer blockiert:

go func() {
    v := <-ch // leaks if no sender and ch is never closed
    use(v)
}()

Häufiges Leak: kein Done-Signal

Eine Goroutine in einer for-Schleife ohne Abbruchbedingung oder Done-Channel läuft für immer:

go func() {
    for {
        work()
        // no exit condition — leaks
    }
}()

Leaks mit goleak erkennen

go.uber.org/goleak überprüft, dass am Ende eines Tests keine Goroutinen geleakt sind:

func TestMyFunc(t *testing.T) {
    defer goleak.VerifyNone(t)
    myFunc() // should not leak goroutines
}

Context als Lösung

Die idiomatische Methode, lang laufende Goroutinen zu stoppen, ist ein Context. Übergeben Sie ctx an die Goroutine und wählen Sie mit select auf ctx.Done() aus.

go func(ctx context.Context) {
    for {
        select {
        case work := <-workCh:
            process(work)
        case <-ctx.Done():
            return // clean exit
        }
    }
}(ctx)

Done-Channel-Muster

Für einfachere Fälle ohne Context verwenden Sie einen eigenen Done-Channel. Schließen Sie ihn, um allen Goroutinen, die daraus lesen, gleichzeitig das Stoppsignal zu geben.

done := make(chan struct{})
go func() {
    select {
    case v := <-data: use(v)
    case <-done: return
    }
}()
close(done) // stops goroutine

Erkennung mit runtime

Geben Sie die Anzahl der Goroutinen aus, um deren Zunahme zur Laufzeit zu erkennen:

fmt.Println("goroutines:", runtime.NumGoroutine())

Goroutinen im HTTP-Server

net/http verwaltet automatisch Goroutinen pro Anfrage und räumt sie auf, wenn die Anfrage abgeschlossen ist. Handler, die Goroutinen ohne Aufräumlogik starten, können jedoch weiterhin Leaks verursachen.

Leaks testen

Führen Sie Ihre Testsuite mit goleak als TestMain oder mit einem Defer pro Test aus. Jede Goroutine, die nach dem Testkörper nicht beendet wurde, führt zu einem fehlgeschlagenen Test.

func TestMain(m *testing.M) {
    goleak.VerifyTestMain(m)
}

Leaks durch Time.After

time.After in einem select innerhalb einer Schleife erstellt bei jeder Iteration einen neuen Timer, der erst nach seinem Auslösen durch den GC freigegeben werden kann. Ersetzen Sie ihn durch time.NewTimer und Reset.

Leak durch eine Goroutine, die einen Fehler zurückgibt

Wenn eine Goroutine ein Ergebnis über einen Channel senden soll, aber wegen eines Fehlers vorzeitig zurückkehrt, ohne etwas zu senden, wird die empfangende Goroutine für immer blockiert. Senden Sie auf allen Pfaden entweder einen Wert oder schließen Sie den Channel.

Kurzer Test

Was ist die idiomatischste Methode, eine lang laufende Goroutine in Go zu stoppen?

Zusammenfassung: Leak-Erkennung und Abbruch

Wichtige Punkte:

  • Goroutine-Leaks sammeln sich an; überwachen Sie sie mit runtime.NumGoroutine()
  • goleak erkennt Goroutine-Leaks automatisch in Tests
  • Geben Sie Goroutinen immer einen Beendigungspfad: Context, Done-Channel oder geschlossenen Eingabe-Channel
  • time.After in Schleifen erzeugt Timer-Leaks; verwenden Sie NewTimer+Reset

Häufig gestellte Fragen

Ist die Lektion „Leak-Erkennung und Abbruch“ kostenlos?

Ja — der vollständige Text von „Leak-Erkennung und Abbruch“ 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 „Leak-Erkennung und Abbruch“?

Sicherstellen, dass Goroutines beendet werden, und Leaks verhindern 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 4 von 4.

Wie lange dauert die Lektion „Leak-Erkennung und Abbruch“?

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. Pipeline- und Stage-Patterns
  2. errgroup für nebenläufige Fehlerbehandlung
  3. Semaphore-Pattern
  4. Leak-Erkennung und Abbruch
← Zurück zu Go Academy