Aufgabenplaner in Go (Golang): cron, gocron und robfig/cron

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): 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/v3


Basisbeispiel

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 Einheiten
  • 1,15,30 — bestimmte Werte
  • 1-10 — Bereich
  • L — 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/v2


Anwendungsbeispiel

package main

import ( "fmt

Empfehlungen