Agendador de tarefas em Go (Golang): do ticker simples ao cron industrial
Um agendador de tarefas (task scheduler) é um componente que permite executar funções específicas em um horário determinado ou com uma periodicidade definida. No ecossistema Go (Golang), existem várias abordagens para implementar um agendador: desde primitivas nativas da linguagem até bibliotecas de terceiros poderosas. Neste artigo, vamos explorar como criar um agendador de tarefas em Go, começando com exemplos simples e terminando com o uso da biblioteca popular robfig/cron.
Por que usar um agendador de tarefas em Go?
Go é ideal para criar aplicações servidoras de alto desempenho, microsserviços e utilitários de linha de comando. Um agendador de tarefas permite automatizar operações rotineiras:
- Limpeza de cache ou arquivos temporários
- Envio de notificações periódicas (email, SMS)
- Coleta de métricas e monitoramento
- Sincronização de dados com APIs externas
- Geração de relatórios agendados
Agendador básico usando time.Ticker
A maneira mais simples de executar uma tarefa a cada N segundos é usar time.Ticker. Esta ferramenta nativa do Go envia um valor para um canal em intervalos de tempo definidos.
package main
import ( "fmt" "time")
func main() { ticker := time.NewTicker(2 * time.Second) done := make(chan bool)
go func() { for { select { case <-ticker.C: fmt.Println("Tarefa executada:", time.Now().Format(time.RFC3339)) case <-done: ticker.Stop() return } } }()
// Parar o agendador após 10 segundos time.Sleep(10 * time.Second) done <- true fmt.Println("Agendador parado")}Este código cria uma goroutine que imprime a hora atual a cada 2 segundos. Observe o uso de select — este é um padrão chave do Go para processamento não bloqueante de múltiplos canais.
Agendador com agendamento flexível: biblioteca robfig/cron
Para projetos reais que exigem um agendamento no estilo cron (por exemplo, "toda segunda-feira às 9:00" ou "a cada 5 minutos das 9 às 18"), a melhor opção é a biblioteca github.com/robfig/cron/v3. Ela suporta totalmente a sintaxe padrão do cron e adiciona funcionalidades convenientes, como suporte a fusos horários e tratamento de pânicos.
Instalação
go get github.com/robfig/cron/v3Exemplo de uso
package main
import ( "fmt" "log" "time"
"github.com/robfig/cron/v3")
func main() { c := cron.New(cron.WithSeconds()) // Ativa suporte a segundos
// Adiciona tarefa: a cada 10 segundos _, err := c.AddFunc("*/10 * * * * *", func() { fmt.Println("Tarefa 1: a cada 10 segundos", time.Now().Format(time.RFC3339)) }) if err != nil { log.Fatal(err) }
// Tarefa: todos os dias às 14:30 UTC _, err = c.AddFunc("0 30 14 * * *", func() { fmt.Println("Tarefa 2: diariamente às 14:30 UTC") }) if err != nil { log.Fatal(err) }
// Tarefa com nome para gerenciamento posterior entryID, _ := c.AddFunc("@every 1m", func() { fmt.Println("Tarefa 3: a cada minuto") })
c.Start()
// Remove a tarefa após 5 minutos time.Sleep(5 * time.Minute) c.Remove(entryID) fmt.Println("Tarefa 3 removida")
// Bloqueia o main select {}}A biblioteca suporta vários formatos de agendamento:
- Cron padrão:
"30 * * * *"— a cada 30 minutos - Com segundos:
"0 30 * * * *"— aos 30 segundos de cada minuto - @every:
"@every 5m"— a cada 5 minutos Também na biblioteca
Recommendations