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()
}
注意事项
- 确保主程序不会退出,否则调度器会停止工作
- 长时间运行的任务考虑使用单例模式
- 在生产环境中考虑使用分布式锁
- 错误处理很重要,不要忽略Do()返回的错误
GoCron是一个功能强大但简单的调度库,适合大多数定时任务需求。对于更复杂的调度需求,可能需要考虑更专业的解决方案如Kubernetes CronJobs或其他企业级调度系统。
希望这个指南能帮助你快速上手GoCron!