在Go语言中,虽然没有内置的Cron(定时任务)库,但可以使用第三方库来轻松实现基于Cron表达式的定时任务功能。一个广受欢迎的库是 github.com/robfig/cron,它提供了与Unix cron
类似的调度器,用于按照预设的时间表执行任务。
以下是如何使用robfig/cron
库实现定时任务的基本步骤:
1、安装库: 使用go get
命令安装robfig/cron
库:
go get github.com/robfig/cron/v3
代码案例一
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
// 定义您要定时执行的任务逻辑作为一个函数
func printCurrentTime() {
now := time.Now()
fmt.Printf("Current time: %s\n", now.Format(time.RFC3339))
}
func main() {
c := cron.New()
// 添加定时任务,每5分钟执行一次
_, err := c.AddFunc("*/5 * * * *", printCurrentTime)
if err != nil {
panic(err)
}
// 开始调度器
c.Start()
// 确保程序不会立即退出,例如,等待用户中断(Ctrl+C)
select {}
}
代码案例二
package main
import (
"fmt"
cron "github.com/robfig/cron/v3"
)
func main() {
//创建cron调度器
c := cron.New(cron.WithSeconds())
// 创建一个用于接收退出信号的通道
stopChan := make(chan struct{})
// 计数器用于跟踪任务执行次数
var taskCount uint8 = 0
spec := "*/1 * * * * ?" //秒
_, e := c.AddFunc(spec, func() {
fmt.Println("我开始打印了。。。。。")
taskCount++
// 当任务执行5次后,关闭stopChan以发送退出信号
if taskCount == 5 {
close(stopChan)
}
})
if e != nil {
fmt.Println("error:", e)
}
c.Start()
select { //select {} 阻塞,用于构建无限循环以维持程序运行状态,直到接收到特定的外部信号指示其退出
case <-stopChan:
// 收到退出信号,退出循环并进行必要的清理工作
fmt.Println("Received stop signal, exiting...")
}
}
Cron表达式说明: Cron表达式由五个字段组成,分别代表分钟、小时、月份中的日期、月份和星期几。每个字段可以使用特定的字符和数字来指定时间单位。以下是Cron表达式各字段的格式说明:
- 分钟(0-59):可以用
*
表示任意分钟,*/n
表示每隔n分钟,a-b
表示从a到b的分钟范围,a, b, c
表示在a、b、c分钟分别执行。 - 小时(0-23):同分钟字段。
- 日期(1-31):同分钟字段,但需要注意某些月份可能没有给定日期。
- 月份(1-12):可以用数字表示月份,也可以用Jan、Feb等英文缩写或全称,还可以用
*
表示任意月份。 - 星期(0-6):其中0或7代表周日,1-6代表周一到周六。同样可以使用
*
、*/n
、a-b
、a, b, c
等形式。
示例:
"0 0 * * *"
:每天的0点0分执行。"0 30 10 * *"
:每月的10日30分执行。"*/5 15 * * MON-FRI"
:工作日(周一至周五)的15点每5分钟执行一次。