CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/golang-github-com-go-co-op-gocron-v2

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.

Overview
Eval results
Files

concurrency.mddocs/examples/guides/

Examples: Concurrency

Practical concurrency control examples.

Singleton Mode - Reschedule

package main

import (
    "fmt"
    "time"
    "github.com/go-co-op/gocron/v2"
)

func main() {
    s, _ := gocron.NewScheduler()
    defer s.Shutdown()

    j, _ := s.NewJob(
        gocron.DurationJob(30*time.Second),
        gocron.NewTask(func() {
            fmt.Println("Starting long task...")
            time.Sleep(2 * time.Minute) // Takes longer than interval
            fmt.Println("Long task complete")
        }),
        gocron.WithName("long-task"),
        gocron.WithSingletonMode(gocron.LimitModeReschedule),
    )

    s.Start()
    // Runs at: 0s, 120s, 240s (skips 30s, 60s, 90s, 150s, 180s, 210s)
    select {}
}

Singleton Mode - Wait

func main() {
    s, _ := gocron.NewScheduler()
    defer s.Shutdown()

    j, _ := s.NewJob(
        gocron.DurationJob(30*time.Second),
        gocron.NewTask(func() {
            fmt.Println("Processing queue item...")
            time.Sleep(time.Minute)
            fmt.Println("Queue item processed")
        }),
        gocron.WithName("queue-processor"),
        gocron.WithSingletonMode(gocron.LimitModeWait),
    )

    s.Start()
    // Queues runs at 30s, 60s, 90s; executes sequentially
    select {}
}

Global Concurrency Limit

func main() {
    s, _ := gocron.NewScheduler(
        gocron.WithLimitConcurrentJobs(3, gocron.LimitModeReschedule),
    )
    defer s.Shutdown()

    // Create 10 jobs
    for i := 0; i < 10; i++ {
        jobNum := i
        s.NewJob(
            gocron.DurationJob(time.Second),
            gocron.NewTask(func() {
                fmt.Printf("Job %d starting\n", jobNum)
                time.Sleep(5 * time.Second)
                fmt.Printf("Job %d complete\n", jobNum)
            }),
            gocron.WithName(fmt.Sprintf("job-%d", i)),
        )
    }

    s.Start()
    // Only 3 jobs run concurrently at any time
    select {}
}

Interval From Completion

func main() {
    s, _ := gocron.NewScheduler()
    defer s.Shutdown()

    j, _ := s.NewJob(
        gocron.DurationJob(5*time.Minute),
        gocron.NewTask(func() {
            fmt.Println("Starting API call...")
            time.Sleep(2 * time.Minute) // Variable duration
            fmt.Println("API call complete")
        }),
        gocron.WithName("api-call"),
        gocron.WithIntervalFromCompletion(), // 5min rest after completion
    )

    s.Start()
    // Runs at: 0min, 7min (2min work + 5min rest), 14min, etc.
    select {}
}

Combined Pattern

func main() {
    s, _ := gocron.NewScheduler(
        gocron.WithLimitConcurrentJobs(5, gocron.LimitModeReschedule),
    )
    defer s.Shutdown()

    // Job 1: Rate-limited API calls
    s.NewJob(
        gocron.DurationJob(5*time.Second),
        gocron.NewTask(func() {
            callExternalAPI()
        }),
        gocron.WithName("api-caller"),
        gocron.WithIntervalFromCompletion(),
        gocron.WithSingletonMode(gocron.LimitModeReschedule),
    )

    // Job 2: Sequential processing
    s.NewJob(
        gocron.DurationJob(time.Minute),
        gocron.NewTask(func() {
            processQueueItem()
        }),
        gocron.WithName("queue-processor"),
        gocron.WithSingletonMode(gocron.LimitModeWait),
    )

    // Job 3: Health check (can run concurrently)
    s.NewJob(
        gocron.DurationJob(30*time.Second),
        gocron.NewTask(func() {
            healthCheck()
        }),
        gocron.WithName("health-check"),
    )

    s.Start()
    select {}
}

func callExternalAPI() {
    fmt.Println("Calling API...")
}

func processQueueItem() {
    fmt.Println("Processing queue...")
}

func healthCheck() {
    fmt.Println("Health check...")
}

See Also

  • Concurrency Guide
  • Singleton Mode Guide
  • Scheduler Limits Guide

Install with Tessl CLI

npx tessl i tessl/golang-github-com-go-co-op-gocron-v2

docs

index.md

tile.json