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.
Options for controlling concurrent job execution.
func WithSingletonMode(mode LimitMode) JobOption
type LimitMode int
const (
LimitModeReschedule LimitMode = 1
LimitModeWait LimitMode = 2
)Prevents a job from running concurrently with itself.
Modes:
// Skip overlapping runs
j, _ := s.NewJob(
gocron.DurationJob(30*time.Second),
gocron.NewTask(func() {
time.Sleep(time.Minute) // takes longer than interval
}),
gocron.WithSingletonMode(gocron.LimitModeReschedule),
)
// Runs at: 0s, 60s, 120s (skips 30s, 90s)// Queue overlapping runs
j, _ := s.NewJob(
gocron.DurationJob(30*time.Second),
gocron.NewTask(func() {
time.Sleep(time.Minute)
}),
gocron.WithSingletonMode(gocron.LimitModeWait),
)
// Queues runs at 30s, 90s; executes sequentiallyWhen to use:
See Concurrency Guide.
Available at scheduler level via WithLimitConcurrentJobs(limit, mode). See Creating Schedulers.
func WithIntervalFromCompletion() JobOptionCalculates next run from job completion time instead of scheduled start time. Only applies to DurationJob and DurationRandomJob.
Without this option (default):
With this option:
j, _ := s.NewJob(
gocron.DurationJob(5*time.Minute),
gocron.NewTask(func() {
doSlowWork() // variable duration
}),
gocron.WithIntervalFromCompletion(),
)Uses:
Interaction with singleton mode: Queued runs also respect this option (each starts N minutes after previous completion).
j, _ := s.NewJob(
gocron.DurationJob(time.Minute),
gocron.NewTask(func() {
// Long-running database backup
backupDatabase()
}),
gocron.WithSingletonMode(gocron.LimitModeReschedule),
)j, _ := s.NewJob(
gocron.DurationJob(30*time.Second),
gocron.NewTask(func() {
processQueueItem()
}),
gocron.WithSingletonMode(gocron.LimitModeWait),
)j, _ := s.NewJob(
gocron.DurationJob(5*time.Second),
gocron.NewTask(func() {
callExternalAPI() // rate limit: 1 call per 5 seconds
}),
gocron.WithIntervalFromCompletion(),
gocron.WithSingletonMode(gocron.LimitModeReschedule),
)j, _ := s.NewJob(
gocron.DurationJob(10*time.Minute),
gocron.NewTask(func() {
// CPU-heavy task, needs cooldown
processLargeDataset()
}),
gocron.WithIntervalFromCompletion(), // Ensure 10 min rest after completion
gocron.WithSingletonMode(gocron.LimitModeReschedule),
)s, _ := gocron.NewScheduler(
gocron.WithLimitConcurrentJobs(3, gocron.LimitModeReschedule),
)
// Only 3 jobs run concurrently across all jobs
for i := 0; i < 10; i++ {
s.NewJob(
gocron.DurationJob(time.Second),
gocron.NewTask(func() {
time.Sleep(5 * time.Second)
}),
)
}
s.Start()| Aspect | LimitModeReschedule | LimitModeWait |
|---|---|---|
| Behavior | Skip if running | Queue if running |
| Missed runs | Lost | Preserved |
| Use case | Idempotent tasks | Sequential tasks |
| Examples | Health checks, metrics | Queue processing, migrations |
Install with Tessl CLI
npx tessl i tessl/golang-github-com-go-co-op-gocron-v2docs
api
examples
guides