Planificateur de tâches en Go (Golang) : cron, gocron et robfig/cron

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Planificateur de tâches en Go (Golang) : cron, gocron et robfig/cron



Un planificateur de tâches (task scheduler) est un outil indispensable pour automatiser les opérations périodiques dans les applications : de la vidange du cache et de l'envoi de notifications au lancement de gestionnaires de données en arrière-plan. Dans l'écosystème Go (Golang), il existe plusieurs bibliothèques populaires pour implémenter un comportement de type cron. Dans cet article, nous examinerons trois approches principales : le package intégré cron, le léger gocron et le standard de facto robfig/cron.



1. Package intégré cron (expérimental)



Depuis Go 1.19, un package expérimental cron est apparu dans la bibliothèque standard, dans golang.org/x/exp/cron. Il fournit des fonctionnalités de base pour exécuter des tâches selon un calendrier. Cependant, en pratique, il est rarement utilisé en raison de fonctionnalités limitées et de l'absence de prise en charge d'expressions cron complexes (par exemple, avec des secondes).



package main

import ( "context" "fmt" "golang.org/x/exp/cron" "time")

func main() { sched := cron.New() // Exécution toutes les 10 secondes sched.Add("*/10 * * * * *", func() { fmt.Println("Tâche exécutée :", time.Now()) }) sched.Start() time.Sleep(30 * time.Second) sched.Stop()}


2. Bibliothèque robfig/cron — l'étalon-or



La bibliothèque github.com/robfig/cron/v3 est l'implémentation la plus populaire et la plus mature d'un planificateur de tâches en Go. Elle prend en charge :

  • Les expressions cron standard (5 champs) avec un champ optionnel pour les secondes
  • Les planifications prédéfinies : @yearly, @monthly, @weekly, @daily, @hourly
  • Les intervalles : @every 5m (toutes les 5 minutes)
  • Les fuseaux horaires (timezone)
  • La gestion des paniques via le journaliseur Recovery
  • Un système de journalisation flexible via l'interface Logger


Installation

go get github.com/robfig/cron/v3


Exemple de base

package main

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

func main() { c := cron.New(cron.WithSeconds()) // Activation de la prise en charge des secondes

// Chaque minute à 30 secondes c.AddFunc("30 * * * * *", func() { fmt.Println("Chaque minute à 30 secondes :", time.Now().Format("15:04:05")) })

// Chaque jour à 8h00 du matin c.AddFunc("0 0 8 * * *", func() { fmt.Println("Tous les jours à 8h00") })

// Toutes les 2 heures c.AddFunc("@every 2h", func() { fmt.Println("Toutes les 2 heures") })

// Lundi à 9h30 c.AddFunc("30 9 * * 1", func() { fmt.Println("Chaque lundi à 9h30") })

c.Start() defer c.Stop()

// Attend 1 minute pour voir l'exécution time.Sleep(70 * time.Second)}


Syntaxe des expressions cron dans robfig/cron

L'expression standard se compose de 5 champs (minutes, heures, jour du mois, mois, jour de la semaine). Lorsque l'option cron.WithSeconds() est activée, un sixième champ est ajouté — les secondes (0-59).

  • * — n'importe quelle valeur
  • */5 — toutes les 5 unités
  • 1,15,30 — valeurs spécifiques
  • 1-10 — plage
  • L — dernier (par exemple, le dernier jour du mois)


3. Bibliothèque gocron — simplicité et lisibilité



github.com/go-co-op/gocron propose une interface plus haut niveau, de type fluent, pour créer des planifications. Elle est idéale si vous n'avez pas besoin d'expressions cron complexes et que des intervalles simples suffisent.



Installation

go get github.com/go-co-op/gocron/v2


Exemple d'utilisation

package main

import ( "fmt

Recommendations