A Golang job scheduling library that lets you run Go functions at pre-determined intervals using cron expressions, fixed durations, daily, weekly, monthly, or one-time schedules with support for distributed deployments.
Practical examples of scheduler operations.
package main
import (
"fmt"
"time"
"github.com/go-co-op/gocron/v2"
)
func main() {
// Create scheduler
s, err := gocron.NewScheduler()
if err != nil {
panic(err)
}
defer s.Shutdown()
// Add job
j, err := s.NewJob(
gocron.DurationJob(time.Minute),
gocron.NewTask(func() {
fmt.Println("Task running")
}),
)
if err != nil {
panic(err)
}
fmt.Printf("Job scheduled: %s\n", j.ID())
// Start scheduling
s.Start()
// Block
select {}
}func main() {
s, _ := gocron.NewScheduler()
defer s.Shutdown()
// Create multiple jobs
j1, _ := s.NewJob(
gocron.DurationJob(time.Minute),
gocron.NewTask(task1),
gocron.WithName("task1"),
gocron.WithTags("worker"),
)
j2, _ := s.NewJob(
gocron.DurationJob(time.Minute),
gocron.NewTask(task2),
gocron.WithName("task2"),
gocron.WithTags("worker"),
)
s.Start()
// List all jobs
jobs := s.Jobs()
fmt.Printf("Total jobs: %d\n", len(jobs))
for _, j := range jobs {
fmt.Printf(" - %s (ID: %s)\n", j.Name(), j.ID())
}
// Remove job by ID
time.Sleep(5 * time.Second)
if err := s.RemoveJob(j1.ID()); err != nil {
fmt.Printf("Error removing job: %v\n", err)
}
// Remove jobs by tag
if err := s.RemoveByTags("worker"); err != nil {
fmt.Printf("Error removing by tags: %v\n", err)
}
select {}
}
func task1() {
fmt.Println("Task 1")
}
func task2() {
fmt.Println("Task 2")
}func main() {
s, _ := gocron.NewScheduler()
defer s.Shutdown()
// Create job
j, _ := s.NewJob(
gocron.DurationJob(time.Minute),
gocron.NewTask(func() {
fmt.Println("Original interval")
}),
gocron.WithName("updatable-job"),
)
s.Start()
fmt.Printf("Initial interval: 1 minute\n")
time.Sleep(5 * time.Second)
// Update job with new interval
newJob, err := s.Update(
j.ID(),
gocron.DurationJob(5*time.Minute), // New interval
gocron.NewTask(func() {
fmt.Println("Updated interval")
}),
gocron.WithName("updatable-job"),
)
if err != nil {
fmt.Printf("Error updating: %v\n", err)
} else {
fmt.Printf("Updated interval: 5 minutes\n")
}
select {}
}import (
"context"
"os"
"os/signal"
"syscall"
)
func main() {
s, _ := gocron.NewScheduler(
gocron.WithStopTimeout(30*time.Second),
)
// Add jobs...
s.NewJob(
gocron.DurationJob(time.Minute),
gocron.NewTask(func() {
fmt.Println("Working...")
time.Sleep(5 * time.Second)
}),
)
s.Start()
// Wait for interrupt signal
ctx, cancel := signal.NotifyContext(
context.Background(),
os.Interrupt,
syscall.SIGTERM,
)
defer cancel()
<-ctx.Done()
fmt.Println("Shutting down...")
if err := s.Shutdown(); err != nil {
fmt.Printf("Shutdown error: %v\n", err)
}
fmt.Println("Shutdown complete")
}Install with Tessl CLI
npx tessl i tessl/golang-github-com-go-co-op-gocron-v2@2.19.1docs
api
examples
guides