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/v3Exemple 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és1,15,30— valeurs spécifiques1-10— plageL— 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/v2Exemple d'utilisation
package main
import ( "fmt Aussi dans la bibliothèque
Swagger-PHP pour PHP : guide complet avec exemples
Travailler avec Excel en PHP : bibliothèques PhpSpreadsheet, PhpOffice et génération XLSX
StackExchange.Redis pour C# (.NET) : guide complet avec exemples
SwiftyUserDefaults Swift : guide complet avec exemples
Rate Limiting en C++ : bibliothèques et implémentation pour la protection d'API