Agendador de tarefas em Go (Golang): guia para implementação de tarefas 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): 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/v3


Exemplo 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:

Recommendations