golang轻量级任务调度与定时作业管理插件库gocron的使用

Golang轻量级任务调度与定时作业管理插件库gocron的使用

gocron是一个Golang任务调度包,可以让你在预定的时间间隔运行Go函数。

快速开始

首先安装gocron:

go get github.com/go-co-op/gocron/v2

下面是一个基本的使用示例:

package main

import (
	"fmt"
	"time"

	"github.com/go-co-op/gocron/v2"
)

func main() {
	// 创建一个调度器
	s, err := gocron.NewScheduler()
	if err != nil {
		// 处理错误
	}

	// 向调度器添加一个作业
	j, err := s.NewJob(
		gocron.DurationJob(
			10*time.Second, // 每10秒执行一次
		),
		gocron.NewTask(
			func(a string, b int) {
				// 执行任务
				fmt.Printf("执行任务,参数: %s, %d\n", a, b)
			},
			"hello", // 第一个参数
			1,       // 第二个参数
		),
	)
	if err != nil {
		// 处理错误
	}
	// 每个作业都有一个唯一的ID
	fmt.Println("作业ID:", j.ID())

	// 启动调度器
	s.Start()

	// 阻塞直到准备好关闭
	select {
	case <-time.After(time.Minute):
	}

	// 完成后关闭调度器
	err = s.Shutdown()
	if err != nil {
		// 处理错误
	}
}

核心概念

  • Job(作业): 作业封装了一个"任务",由Go函数和任何函数参数组成。作业为调度器提供作业下次应该运行的时间。
  • Scheduler(调度器): 调度器跟踪所有作业,并在作业准备运行时将其发送给执行器。
  • Executor(执行器): 执行器调用作业的任务,并管理不同作业执行时序要求的复杂性。

作业类型

gocron支持多种作业类型:

  • DurationJob: 按固定时间间隔运行
  • DurationRandomJob: 在最小和最大之间随机时间间隔运行
  • CronJob: 使用crontab表达式运行
  • DailyJob: 每天在特定时间运行
  • WeeklyJob: 每周在特定日期和时间运行
  • MonthlyJob: 每月在特定日期和时间运行
  • OneTimeJob: 在特定时间运行(一次或多次)

并发限制

  • 单例模式: 作业可以限制为单次并发执行
  • 限制模式: 可以限制整个调度器的并发作业数量

分布式支持

gocron支持分布式运行:

  • Elector(选举器): 选举一个gocron实例作为主实例运行
  • Locker(锁): 锁定每个作业运行到单个gocron实例

事件监听

可以为作业添加事件监听器,监听作业事件并触发操作。

日志和监控

  • 支持自定义日志记录
  • 可以从每个作业的执行中收集指标

测试支持

gocron提供了测试支持:

  • 提供mock包
  • 可以通过FakeClock模拟时间

以上是gocron的基本使用方法和功能特性,更多详细用法可以参考官方文档和示例。


更多关于golang轻量级任务调度与定时作业管理插件库gocron的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级任务调度与定时作业管理插件库gocron的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoCron - Golang轻量级任务调度库使用指南

GoCron是一个轻量级的Golang定时任务调度库,它提供了简单易用的API来管理定时作业。下面我将详细介绍GoCron的使用方法。

安装

go get github.com/go-co-op/gocron

基本使用

1. 创建调度器

package main

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

func main() {
	// 创建调度器实例
	s := gocron.NewScheduler(time.UTC)
	
	// 添加任务
	_, err := s.Every(5).Seconds().Do(func() {
		fmt.Println("每5秒执行一次", time.Now())
	})
	if err != nil {
		panic(err)
	}
	
	// 启动调度器
	s.StartAsync()
	
	// 防止主程序退出
	time.Sleep(30 * time.Second)
}

2. 多种时间间隔设置

// 每10分钟执行一次
s.Every(10).Minutes().Do(task)

// 每小时执行一次
s.Every(1).Hour().Do(task)

// 每天10:30执行
s.Every(1).Day().At("10:30").Do(task)

// 每周一10:30执行
s.Every(1).Monday().At("10:30").Do(task)

// 每月1号10:30执行
s.Every(1).Month(1).At("10:30").Do(task)

3. 带参数的任务

func greet(name string) {
	fmt.Printf("Hello, %s! It's %v\n", name, time.Now())
}

func main() {
	s := gocron.NewScheduler(time.UTC)
	
	// 传递参数给任务函数
	_, err := s.Every(2).Seconds().Do(greet, "John")
	if err != nil {
		panic(err)
	}
	
	s.StartAsync()
	time.Sleep(10 * time.Second)
}

高级功能

1. 任务标签管理

s := gocron.NewScheduler(time.UTC)

// 添加带标签的任务
_, err := s.Every(1).Day().At("12:00").Tag("daily", "lunch").Do(task)
if err != nil {
	panic(err)
}

// 通过标签查找任务
jobs, _ := s.FindJobsByTag("daily")

// 通过标签移除任务
s.RemoveByTag("lunch")

2. 单例模式

防止任务重叠执行:

s := gocron.NewScheduler(time.UTC)
s.SingletonMode()

// 如果前一个任务还在运行,这个任务不会启动
_, err := s.Every(1).Second().Do(longRunningTask)
if err != nil {
	panic(err)
}

s.StartAsync()
time.Sleep(10 * time.Second)

3. 限制并发

s := gocron.NewScheduler(time.UTC)
s.SetMaxConcurrentJobs(2, gocron.RescheduleMode) // 最多同时运行2个任务

// 添加多个任务...

4. 分布式锁

// 使用Redis分布式锁
locker, err := redislock.NewRedisLocker(client)
if err != nil {
	panic(err)
}

s := gocron.NewScheduler(time.UTC)
s.WithDistributedLocker(locker)

// 添加任务...

完整示例

package main

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

func main() {
	// 创建调度器
	s := gocron.NewScheduler(time.UTC)
	
	// 设置单例模式,防止任务重叠
	s.SingletonMode()
	
	// 添加多个任务
	_, _ = s.Every(5).Seconds().Do(func() {
		fmt.Println("每5秒执行的任务", time.Now())
	})
	
	_, _ = s.Every(1).Minute().Do(func() {
		fmt.Println("每分钟执行的任务", time.Now())
	})
	
	_, _ = s.Every(1).Day().At("10:30").Do(func() {
		fmt.Println("每天10:30执行的任务", time.Now())
	})
	
	// 启动调度器
	s.StartAsync()
	
	// 让程序运行一段时间
	time.Sleep(5 * time.Minute)
	
	// 停止调度器
	s.Stop()
}

注意事项

  1. 确保主程序不会退出,否则调度器会停止工作
  2. 长时间运行的任务考虑使用单例模式
  3. 在生产环境中考虑使用分布式锁
  4. 错误处理很重要,不要忽略Do()返回的错误

GoCron是一个功能强大但简单的调度库,适合大多数定时任务需求。对于更复杂的调度需求,可能需要考虑更专业的解决方案如Kubernetes CronJobs或其他企业级调度系统。

希望这个指南能帮助你快速上手GoCron!

回到顶部