golang支持cron调度的定时任务执行插件库cronticker的使用
golang支持cron调度的定时任务执行插件库cronticker的使用
介绍
cronticker是一个支持Cron调度的Golang定时器库,可以按照Unix或Quartz格式的cron表达式来执行定时任务。
安装
go get github.com/krayzpipes/cronticker/cronticker
导入包:
import "github.com/krayzpipes/cronticker/cronticker"
使用示例
创建定时器
// 创建一个每周日纽约时间0点的定时器
ticker, err := cronticker.NewTicker("TZ=America/New_York 0 0 0 ? * SUN")
if err != nil {
log.Fatal(err)
}
defer ticker.Stop() // 确保停止定时器释放资源
监听定时事件
// 等待下一次触发时间
tickerTime := <-ticker.C
fmt.Println("定时任务触发时间:", tickerTime)
重置定时器
// 重置为每周一、二、三0点触发
err = ticker.Reset("0 0 0 ? * MON,TUE,WED")
if err != nil {
log.Fatal(err)
}
停止定时器
ticker.Stop()
Cron表达式格式
支持Unix和Quartz两种格式,还可以使用@daily等指令。可以在表达式前添加TZ=时区来指定时区,默认是UTC。
示例
Cron表达式 | 类型/格式 | 描述 |
---|---|---|
“TZ=America/Los_Angeles 0 0 * * *” | Unix | 洛杉矶时间每天0点 |
“TZ=America/Los_Angeles 0 0 0 ? * MON” | Quartz | 洛杉矶时间每周一0点 |
“TZ=America/Los_Angeles @daily” | 指令 | 洛杉矶时间每天0点 |
“@daily” | 指令 | UTC时间每天0点 |
特殊字符
字符 | 描述 | 示例 |
---|---|---|
- | 范围 | 4-5 |
/ | 步长 | 0/5 |
* | 任意 | */5 |
, | 列表 | 1,4,5 |
完整示例
package main
import (
"fmt"
"log"
"time"
"github.com/krayzpipes/cronticker/cronticker"
)
func main() {
// 创建一个每天UTC时间0点触发的定时器
ticker, err := cronticker.NewTicker("[@daily](/user/daily)")
if err != nil {
log.Fatal(err)
}
defer ticker.Stop() // 确保程序退出时停止定时器
fmt.Println("等待每日定时任务...")
// 监听定时器通道
for tickTime := range ticker.C {
fmt.Printf("定时任务触发时间: %v\n", tickTime)
// 在这里执行你的定时任务逻辑
doDailyTask()
}
}
func doDailyTask() {
fmt.Println("执行每日任务...")
// 这里放置你的定时任务代码
}
这个示例展示了如何创建一个每天UTC时间0点触发的定时器,并在触发时执行任务。程序会一直运行,等待每天的定时触发。
更多关于golang支持cron调度的定时任务执行插件库cronticker的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang支持cron调度的定时任务执行插件库cronticker的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 定时任务执行插件库 cronticker 使用指南
cronticker 是一个轻量级的 Golang 定时任务调度库,它提供了类似 cron 表达式的定时任务执行功能。下面我将详细介绍如何使用这个库。
安装 cronticker
首先需要安装 cronticker 库:
go get github.com/robfig/cron/v3
基本使用方法
1. 创建定时任务
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func main() {
// 创建一个新的cron实例
c := cron.New()
// 添加定时任务
_, err := c.AddFunc("* * * * *", func() {
fmt.Println("每分钟执行一次:", time.Now().Format("2006-01-02 15:04:05"))
})
if err != nil {
fmt.Println("添加任务失败:", err)
return
}
// 启动cron调度器
c.Start()
// 防止主程序退出
select {}
}
2. cron 表达式格式
cronticker 使用标准的 cron 表达式格式:
* * * * *
| | | | |
| | | | +----- 星期几 (0 - 6) (星期天=0)
| | | +------- 月份 (1 - 12)
| | +--------- 日 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)
3. 常用示例
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
// 每5分钟执行一次
c.AddFunc("*/5 * * * *", func() {
fmt.Println("每5分钟执行:", time.Now().Format("15:04:05"))
})
// 每天凌晨1点执行
c.AddFunc("0 1 * * *", func() {
fmt.Println("每天凌晨1点执行")
})
// 每周一上午9点执行
c.AddFunc("0 9 * * 1", func() {
fmt.Println("每周一上午9点执行")
})
// 每月1号凌晨0点执行
c.AddFunc("0 0 1 * *", func() {
fmt.Println("每月1号凌晨0点执行")
})
c.Start()
select {}
}
高级功能
1. 设置时区
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func main() {
// 使用中国时区
location, _ := time.LoadLocation("Asia/Shanghai")
c := cron.New(cron.WithLocation(location))
c.AddFunc("0 9 * * *", func() {
fmt.Println("北京时间每天9点执行:", time.Now().Format("15:04:05"))
})
c.Start()
select {}
}
2. 任务日志
package main
import (
"fmt"
"log"
"time"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New(
cron.WithLogger(
cron.VerbosePrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags)),
),
)
c.AddFunc("* * * * *", func() {
fmt.Println("每分钟执行一次")
})
c.Start()
select {}
}
3. 任务删除
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
// 添加任务并保存ID
id, _ := c.AddFunc("* * * * *", func() {
fmt.Println("每分钟执行一次")
})
// 10秒后删除任务
time.AfterFunc(10*time.Second, func() {
c.Remove(id)
fmt.Println("任务已删除")
})
c.Start()
select {}
}
注意事项
- cronticker 的最小时间粒度是分钟,不支持秒级任务
- 任务执行是同步的,长时间运行的任务会阻塞后续任务
- 对于需要并发执行的任务,需要在任务函数内部自行处理
替代方案
如果你需要更复杂的定时任务功能,也可以考虑以下替代方案:
- github.com/robfig/cron - 功能更全面的 cron 库
- github.com/jasonlvhit/gocron - 更简单的 API
- github.com/gorhill/cronexpr - 专注于 cron 表达式解析
希望这个指南能帮助你使用 cronticker 实现 Golang 中的定时任务调度!