Agendador de Tarefas em Go (Golang): cron, gocron e robfig/cron

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Agendador de Tarefas em Go (Golang): cron, gocron e robfig/cron



Um agendador de tarefas (task scheduler) é uma ferramenta indispensável para automatizar operações periódicas em aplicações: desde limpeza de cache e envio de notificações até a execução de processadores de dados em segundo plano. No ecossistema Go (Golang), existem várias bibliotecas populares para implementar comportamentos semelhantes ao cron. Neste artigo, vamos explorar três abordagens principais: o pacote integrado cron, o leve gocron e o padrão de facto robfig/cron.



1. Pacote integrado cron (experimental)



A partir do Go 1.19, a biblioteca padrão incluiu um pacote experimental cron em golang.org/x/exp/cron. Ele fornece funcionalidades básicas para executar tarefas agendadas. No entanto, na prática, é raramente utilizado devido à funcionalidade limitada e à falta de suporte para expressões cron complexas (por exemplo, com segundos).



package main

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

func main() { sched := cron.New() // Executar a cada 10 segundos sched.Add("*/10 * * * * *", func() { fmt.Println("Tarefa executada:", time.Now()) }) sched.Start() time.Sleep(30 * time.Second) sched.Stop()}


2. Biblioteca robfig/cron — o padrão ouro



A biblioteca github.com/robfig/cron/v3 é a implementação de agendador de tarefas mais popular e madura em Go. Ela suporta:

  • Expressões cron padrão (5 campos) com campo opcional de segundos
  • Agendamentos predefinidos: @yearly, @monthly, @weekly, @daily, @hourly
  • Intervalos: @every 5m (a cada 5 minutos)
  • Fusos horários (timezone)
  • Tratamento de pânicos através do logger Recovery
  • Sistema de logging flexível através da interface Logger


Instalação

go get github.com/robfig/cron/v3


Exemplo básico

package main

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

func main() { c := cron.New(cron.WithSeconds()) // Ativar suporte a segundos

// A cada minuto aos 30 segundos c.AddFunc("30 * * * * *", func() { fmt.Println("A cada minuto aos 30 segundos:", time.Now().Format("15:04:05")) })

// Todos os dias às 8:00 da manhã c.AddFunc("0 0 8 * * *", func() { fmt.Println("Diariamente às 8:00") })

// A cada 2 horas c.AddFunc("@every 2h", func() { fmt.Println("A cada 2 horas") })

// Segunda-feira às 9:30 c.AddFunc("30 9 * * 1", func() { fmt.Println("Toda segunda-feira às 9:30") })

c.Start() defer c.Stop()

// Aguardar 1 minuto para ver a execução time.Sleep(70 * time.Second)}


Sintaxe de expressões cron no robfig/cron

Uma expressão padrão consiste em 5 campos (minutos, horas, dia do mês, mês, dia da semana). Ao ativar a opção cron.WithSeconds(), um sexto campo é adicionado — segundos (0-59).

  • * — qualquer valor
  • */5 — a cada 5 unidades
  • 1,15,30 — valores específicos
  • 1-10 — intervalo
  • L — último (por exemplo, último dia do mês)


3. Biblioteca gocron — simplicidade e legibilidade



github.com/go-co-op/gocron oferece uma interface fluente e de alto nível para criar agendamentos. É ideal se você não precisa de expressões cron complexas, mas apenas de intervalos simples.



Instalação

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


Exemplo de uso

package main

import ( "fmt"

Recommendations