Aufgabenplaner in Go (Golang): cron, gocron und robfig/cron
Ein Aufgabenplaner (task scheduler) ist ein unverzichtbares Werkzeug zur Automatisierung periodischer Vorgänge in Anwendungen: von der Cache-Bereinigung und dem Versenden von Benachrichtigungen bis zum Starten von Hintergrund-Datenverarbeitern. Im Go (Golang)-Ökosystem gibt es mehrere beliebte Bibliotheken zur Implementierung von Cron-ähnlichem Verhalten. In diesem Artikel betrachten wir drei Hauptansätze: das integrierte Paket cron, das leichtgewichtige gocron und den De-facto-Standard robfig/cron.
1. Integriertes Paket cron (experimentell)
Seit Go 1.19 gibt es in der Standardbibliothek das experimentelle Paket cron in golang.org/x/exp/cron. Es bietet grundlegende Funktionen zum Ausführen von Aufgaben nach Zeitplan. In der Praxis wird es jedoch aufgrund der eingeschränkten Funktionalität und fehlender Unterstützung für komplexe Cron-Ausdrücke (z. B. mit Sekunden) selten verwendet.
package main
import ( "context" "fmt" "golang.org/x/exp/cron" "time")
func main() { sched := cron.New() // Start alle 10 Sekunden sched.Add("*/10 * * * * *", func() { fmt.Println("Aufgabe ausgeführt:", time.Now()) }) sched.Start() time.Sleep(30 * time.Second) sched.Stop()}2. Bibliothek robfig/cron — der Goldstandard
Die Bibliothek github.com/robfig/cron/v3 ist die beliebteste und ausgereifteste Implementierung eines Aufgabenplaners in Go. Sie unterstützt:
- Standard-Cron-Ausdrücke (5 Felder) mit optionalem Sekundenfeld
- Vordefinierte Zeitpläne:
@yearly,@monthly,@weekly,@daily,@hourly - Intervalle:
@every 5m(alle 5 Minuten) - Zeitzonen (timezone)
- Behandlung von Paniken durch den Recovery-Logger
- Flexibles Logging-System über das
Logger-Interface
Installation
go get github.com/robfig/cron/v3Basisbeispiel
package main
import ( "fmt" "github.com/robfig/cron/v3" "time")
func main() { c := cron.New(cron.WithSeconds()) // Sekundenunterstützung aktivieren
// Jede Minute bei 30 Sekunden c.AddFunc("30 * * * * *", func() { fmt.Println("Jede Minute bei 30 Sekunden:", time.Now().Format("15:04:05")) })
// Jeden Tag um 8:00 Uhr morgens c.AddFunc("0 0 8 * * *", func() { fmt.Println("Täglich um 8:00") })
// Alle 2 Stunden c.AddFunc("@every 2h", func() { fmt.Println("Alle 2 Stunden") })
// Montag um 9:30 c.AddFunc("30 9 * * 1", func() { fmt.Println("Jeden Montag um 9:30") })
c.Start() defer c.Stop()
// 1 Minute warten, um die Ausführung zu sehen time.Sleep(70 * time.Second)}Syntax von Cron-Ausdrücken in robfig/cron
Ein Standardausdruck besteht aus 5 Feldern (Minuten, Stunden, Tag des Monats, Monat, Wochentag). Wenn die Option cron.WithSeconds() aktiviert ist, wird ein sechstes Feld hinzugefügt — Sekunden (0-59).
*— beliebiger Wert*/5— alle 5 Einheiten1,15,30— bestimmte Werte1-10— BereichL— letzter (z. B. letzter Tag des Monats)
3. Bibliothek gocron — Einfachheit und Lesbarkeit
github.com/go-co-op/gocron bietet eine höherwertige, fließende Schnittstelle (fluent interface) zur Erstellung von Zeitplänen. Sie ist ideal, wenn Sie keine komplexen Cron-Ausdrücke benötigen, sondern einfache Intervalle ausreichen.
Installation
go get github.com/go-co-op/gocron/v2Anwendungsbeispiel
package main
import ( "fmt