Go Academy · Lektion

Geordnetes Beenden von Jobs

Jobs sauber stoppen

Lektion 4 von 413 Schritte

Geordnetes Beenden von Jobs 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.

Jobs sauber beenden

Ein Scheduler, der während eines Jobs beendet wird, kann Daten beschädigen oder unvollständige Arbeit hinterlassen. Graceful Shutdown bedeutet: keine neuen Ausführungen mehr annehmen, laufende Jobs bis zu einer Frist beenden lassen und anschließend beenden.

Auf Signale warten

Fangen Sie Betriebssystemsignale wie SIGINT (Strg+C) und SIGTERM (Stopp durch den Orchestrator) ab, damit Sie den Dienst gezielt herunterfahren können.

sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
<-sig
fmt.Println("shutting down")

signal.NotifyContext

Go 1.16+ bietet eine praktische Hilfsfunktion, die einen Context abbricht, sobald ein Signal eintrifft.

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
<-ctx.Done()

Den Scheduler anhalten

Bei robfig/cron gibt c.Stop() einen Context zurück, der abgeschlossen ist, sobald alle laufenden Jobs beendet sind. Warten Sie darauf, damit alle Jobs ordnungsgemäß beendet werden.

ctx := c.Stop()        // stops scheduling, returns ctx
<-ctx.Done()            // wait for running jobs
fmt.Println("all jobs finished")

Abbruch an Jobs weitergeben

Übergeben Sie jedem Job einen Context, damit lang laufende Arbeit beim Beginn des Shutdowns umgehend abgebrochen werden kann.

func job(ctx context.Context) {
    select {
    case <-time.After(time.Hour):
    case <-ctx.Done():
        return // bail out early
    }
}

Die Wartezeit begrenzen

Warten Sie nicht unbegrenzt auf festhängende Jobs. Verwenden Sie einen Context mit Timeout, damit der Shutdown auch dann abgeschlossen wird, wenn ein Job hängen bleibt.

shutCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

WaitGroups für eigene Scheduler

Wenn Sie einen eigenen Scheduler mit Goroutinen erstellen, verfolgen Sie diese mit einem sync.WaitGroup und verwenden Sie beim Shutdown Wait().

var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done(); doWork() }()
// shutdown:
wg.Wait()

Keine neue Arbeit starten

Sobald der Shutdown beginnt, dürfen Ticker oder Cron keine weiteren Ausführungen auslösen. Das Schließen eines Done-Kanals oder das Abbrechen des Contexts stellt sicher, dass die Schleife das Signal erkennt und keine neuen Läufe mehr plant.

Idempotenz hilft

Entwerfen Sie Jobs so, dass sie sicher erneut ausgeführt werden können. Wenn ein Job mitten in der Ausführung beendet und nach dem Neustart wiederholt wird, verhindert idempotente Logik doppelte Auswirkungen, etwa doppelte E-Mails oder doppelte Abbuchungen.

Das vollständige Muster

Zusammengefasst: ein Context, der bei einem Signal abgebrochen wird, ein Cron-Stop, der einen Context zum Abwarten laufender Jobs zurückgibt, und ein begrenztes Timeout. Das ist das Standardgerüst für einen Graceful Shutdown in geplanten Diensten.

Ausführbar: Graceful Stop mit Context

Dieses eigenständige Programm führt einen periodischen Worker aus und beendet ihn durch das Abbrechen des Contexts ordnungsgemäß. Dabei wartet es, bis der laufende Takt abgeschlossen ist.

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        t := time.NewTicker(5 * time.Millisecond)
        defer t.Stop()
        for {
            select {
            case <-t.C:
                fmt.Println("working")
            case <-ctx.Done():
                fmt.Println("stopping cleanly")
                return
            }
        }
    }()
    time.Sleep(17 * time.Millisecond)
    cancel()   // signal shutdown
    wg.Wait()  // wait for worker to finish
    fmt.Println("shutdown complete")
}

Kurzer Test

Testen Sie Ihr Verständnis des ordnungsgemäßen Beendens von Jobs.

Zusammenfassung

Sie haben das ordnungsgemäße Beenden von Jobs kennengelernt:

  • Fangen Sie SIGINT/SIGTERM ab, idealerweise über signal.NotifyContext
  • cron.Stop() gibt einen Context zurück, der wartet, bis laufende Jobs beendet sind
  • Geben Sie den Context an Jobs weiter und begrenzen Sie die Wartezeit mit einem Timeout
  • Gestalten Sie Jobs idempotent, damit Wiederholungen sicher sind
Kostenlos starten

Lerne Go mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
51
Lektionen
203

Häufig gestellte Fragen

Ist die Lektion „Geordnetes Beenden von Jobs“ kostenlos?

Ja — der vollständige Text von „Geordnetes Beenden von Jobs“ 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 „Geordnetes Beenden von Jobs“?

Jobs sauber stoppen 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 „Geordnetes Beenden von Jobs“?

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. Zeitbasierte Planung
  2. Die robfig/cron-Bibliothek
  3. Ticker für Intervalle
  4. Geordnetes Beenden von Jobs
← Zurück zu Go Academy