Aufgabenplaner in Go (Golang): Leitfaden zur Implementierung von Cron-Jobs

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Aufgabenplaner in Go (Golang): Vom einfachen Ticker bis zum industriellen Cron



Ein Aufgabenplaner (Task Scheduler) ist eine Komponente, die es ermöglicht, bestimmte Funktionen zu einer festgelegten Zeit oder in einem festgelegten Intervall auszuführen. Im Ökosystem von Go (Golang) gibt es mehrere Ansätze zur Implementierung eines Planers: von integrierten Sprachprimitiven bis hin zu leistungsstarken Drittanbieter-Bibliotheken. In diesem Artikel werden wir uns ansehen, wie man einen Aufgabenplaner in Go erstellt, angefangen bei einfachen Beispielen bis hin zur Verwendung der beliebten Bibliothek robfig/cron.



Wozu braucht man einen Aufgabenplaner in Go?

Go eignet sich ideal für die Erstellung leistungsstarker Serveranwendungen, Microservices und Kommandozeilen-Tools. Ein Aufgabenplaner ermöglicht die Automatisierung von Routineaufgaben:

  • Bereinigung von Cache oder temporären Dateien
  • Versand periodischer Benachrichtigungen (E-Mail, SMS)
  • Erfassung von Metriken und Monitoring
  • Synchronisation von Daten mit externen APIs
  • Planmäßige Generierung von Berichten


Basis-Planer mit time.Ticker

Der einfachste Weg, eine Aufgabe alle N Sekunden auszuführen, ist die Verwendung von time.Ticker. Dieses integrierte Go-Tool sendet in festgelegten Zeitabständen einen Wert an einen Kanal.



package main

import ( "fmt" "time")

func main() { ticker := time.NewTicker(2 * time.Second) done := make(chan bool)

go func() { for { select { case <-ticker.C: fmt.Println("Aufgabe ausgeführt:", time.Now().Format(time.RFC3339)) case <-done: ticker.Stop() return } } }()

// Planer nach 10 Sekunden stoppen time.Sleep(10 * time.Second) done <- true fmt.Println("Planer gestoppt")}


Dieser Code erstellt eine Goroutine, die alle 2 Sekunden die aktuelle Uhrzeit ausgibt. Beachten Sie die Verwendung von select – dies ist ein zentrales Go-Muster für die nicht-blockierende Verarbeitung mehrerer Kanäle.



Planer mit flexiblem Zeitplan: Die Bibliothek robfig/cron

Für reale Projekte, die einen cron-ähnlichen Zeitplan erfordern (z. B. "jeden Montag um 9:00 Uhr" oder "alle 5 Minuten von 9 bis 18 Uhr"), eignet sich die Bibliothek github.com/robfig/cron/v3 am besten. Sie unterstützt vollständig die standardmäßige Cron-Syntax und bietet praktische Funktionen wie die Arbeit mit Zeitzonen und die Behandlung von Panics.



Installation

go get github.com/robfig/cron/v3


Anwendungsbeispiel

package main

import ( "fmt" "log" "time"

"github.com/robfig/cron/v3")

func main() { c := cron.New(cron.WithSeconds()) // Sekundenunterstützung aktivieren

// Aufgabe hinzufügen: alle 10 Sekunden _, err := c.AddFunc("*/10 * * * * *", func() { fmt.Println("Aufgabe 1: alle 10 Sekunden", time.Now().Format(time.RFC3339)) }) if err != nil { log.Fatal(err) }

// Aufgabe: täglich um 14:30 UTC _, err = c.AddFunc("0 30 14 * * *", func() { fmt.Println("Aufgabe 2: täglich um 14:30 UTC") }) if err != nil { log.Fatal(err) }

// Aufgabe mit Namen für spätere Verwaltung entryID, _ := c.AddFunc("@every 1m", func() { fmt.Println("Aufgabe 3: jede Minute") })

c.Start()

// Aufgabe nach 5 Minuten entfernen time.Sleep(5 * time.Minute) c.Remove(entryID) fmt.Println("Aufgabe 3 entfernt")

// main blockieren select {}}


Die Bibliothek unterstützt mehrere Zeitplanformate:

Empfehlungen