Aufgabenplaner in Go (Golang): cron, gocron und asynq

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): von cron bis asynq



In der modernen Serverentwicklung mit Go (Golang) besteht häufig die Notwendigkeit, Code zeitgesteuert oder mit Verzögerung auszuführen. Cache-Bereinigung, Versand von Benachrichtigungen, Berichtserstellung – all dies erfordert einen zuverlässigen Aufgabenplaner. In diesem Artikel werden wir drei beliebte Ansätze im Detail besprechen: das Standardpaket cron, die leichtgewichtige Bibliothek gocron und die verteilte Warteschlange asynq. Sie erfahren, welches Tool Sie für Ihr Projekt auf PythonLib wählen sollten.



1. Standard-cron für Go



Die Bibliothek github.com/robfig/cron/v3 ist der De-facto-Standard für die Planung wiederkehrender Aufgaben in Go. Sie verwendet die bekannte Syntax von cron-Ausdrücken (5 Felder) und unterstützt Sekunden, Zeitzonen und Wiederherstellung nach Paniken.



Installation und Basisbeispiel



go get github.com/robfig/cron/v3


Beispiel für einen Planer, der eine Aufgabe alle 30 Sekunden ausführt:



package main

import ( "fmt" "github.com/robfig/cron/v3")

func main() { c := cron.New() // Aufgabe mit cron-Ausdruck hinzufügen: alle 30 Sekunden _, err := c.AddFunc("*/30 * * * * *", func() { fmt.Println("Aufgabe ausgeführt:", time.Now()) }) if err != nil { panic(err) } c.Start() // Hauptgoroutine blockieren select {}}


Wichtige Merkmale:

  • Unterstützung für Standard-cron-Ausdrücke (5 oder 6 Felder mit Sekunden)
  • Automatische Wiederherstellung nach einer Panik in der Aufgabe
  • Möglichkeit, die Zeitzone über cron.WithLocation() festzulegen
  • Protokollierung über cron.WithLogger()


Fortgeschrittene Nutzung: verkettete Jobs



c := cron.New(cron.WithSeconds())

// Aufgabe mit Namen zur Verwaltungid, _ := c.AddFunc("@every 5m", func() { fmt.Println("Wird alle 5 Minuten ausgeführt")})

// Aufgabe nach ID entfernenc.Remove(id)

// Planer anhaltenc.Stop()


Die Bibliothek eignet sich ideal für einfache periodische Aufgaben innerhalb eines einzelnen Prozesses. Für verteilte Systeme (mehrere Replikate eines Go-Servers) ist jedoch eine externe Sperre erforderlich, damit die Aufgabe nicht gleichzeitig auf allen Knoten ausgeführt wird.



2. Gocron – leichter Scheduler mit Verkettungen



github.com/go-co-op/gocron bietet eine modernere API ohne cron-Ausdrücke. Anstelle von Zeichenketten verwenden Sie Methodenverkettungen. Dies ist besonders für Anfänger praktisch.



Beispiel mit gocron



package main

import ( "fmt" "time" "github.com/go-co-op/gocron")

func main() { s := gocron.NewScheduler(time.UTC) // Aufgabe wird alle 2 Minuten ausgeführt _, _ = s.Every(2).Minutes().Do(func() { fmt.Println("2 Minuten sind vergangen") }) // Aufgabe mit Verzögerung nach dem Start _, _ = s.Every(1).Day().At("10:30").Do(func() { fmt.Println("Täglich um 10:30") }) s.StartBlocking()}


Vorteile von gocron:

  • Menschenlesbare API: .Every(10).Seconds()
  • Integrierte Unterstützung für verteilte Sperren über Redis (optional)
  • Möglichkeit, eine Begrenzung der Ausführungsanzahl festzulegen
  • Globale und lokale Fehlerbehandler


Wenn Sie eine einfache Lösung für einen Mikroservice ohne externe Abhängigkeiten benötigen, ist gocron eine ausgezeichnete Wahl. Es ist leichter als cron und erfordert keine Kenntnis der cron-Ausdruckssyntax.



3. Asynq – verteilte Warteschlange für verzögerte Aufgaben



github.com/hibiken/asynq ist nicht nur ein Planer, sondern ein vollwertiges Warteschlangensystem auf Basis von Redis. Es ermöglicht das Zurückstellen von Aufgaben, das Festlegen von Prioritäten, das Wiederholen fehlgeschlagener Aufgaben und die Verfolgung ihres Status über eine Weboberfläche.



Architektur von asynq



Asynq be

Empfehlungen