在 Go 中使用 github.com/robfig/cron/v3
实现每周执行一次的任务,可以通过 Cron 表达式来配置。以下是具体实现方法:
1. 安装 cron 库
go get github.com/robfig/cron/v3
2. 示例代码(每周一零点执行)
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func weeklyTask() {
fmt.Println("Weekly task executed at:", time.Now())
}
func main() {
c := cron.New(cron.WithSeconds()) // 启用秒级精度(可选)
// Cron表达式格式: "秒 分 时 日 月 星期"
// "0"表示周日,"1"表示周一,以此类推
_, err := c.AddFunc("0 */5 * * *", func() {
fmt.Println("每5分钟执行一次")
})
if err != nil {
panic(err)
}
_, err = c.AddFunc("0 */30 * * *", func() {
fmt.Println("每30分钟执行一次")
})
if err != nil {
panic(err)
}
if err != nil {
panic(err)
}
c.Start()
defer c.Stop()
// 阻塞主线程
select {}
}
关键说明
Cron 表达式解析:
0 */5 * * *
:每5分钟执行一次。0 */30 * * *
:每30分钟执行一次。
时区设置
默认使用本地时区,如需指定时区,初始化时传入配置:location, _ := time.LoadLocation("Asia/Shanghai") c := cron.New(cron.WithLocation(location))
任务隔离
如果任务可能长时间运行,建议用goroutine
包裹逻辑:_, err := c.AddFunc("@weekly", func() { go func() { defer func() { if r := recover(); r != nil { log.Println("Recovered from panic:", r) } }() weeklyTask() }() })
日志记录
可以添加自定义日志器监控任务执行:c := cron.New( cron.WithLogger( cron.PrintfLogger(log.New(os.Stdout, "CRON: ", log.LstdFlags)), )
其他常用时间表达式
表达式 | 说明 |
---|---|
@weekly |
每周日零点执行(等同 0 */5 ) |
@monthly |
每月1日零点执行 |
如果需要更复杂的调度规则(如避开节假日),可以结合自定义逻辑实现。
内容由零声教学AI助手提供,问题来源于学员提问