Geordnetes Beenden von Jobs
Jobs sauber stoppen
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
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
- Zeitbasierte Planung
- Die robfig/cron-Bibliothek
- Ticker für Intervalle
- Geordnetes Beenden von Jobs