前言
今天工作中,有一个需求是启动一个异步定时任务,下面是Go实现的方式。
Go实现定时任务
- 创建了一个时间间隔为5分钟的定时器(Ticker)。time.NewTicker接收一个time.Duration类型的参数,这里设置为5分钟。每当到达这个时间间隔,定时器就会发送一个当前时间的值到关联的通道上。defer ticker.Stop()确保程序退出前会停止定时器,防止资源泄露。
package main
import (
"fmt"
"time"
)
func task() {
// 实现具体的函数逻辑
fmt.Println("...")
// ...
}
func init() {
ticker := time.NewTicker(5 * time.Minute) // 每5分钟执行一次
defer ticker.Stop() // 确保程序退出前会停止定时器,防止资源泄露。
for { //无限循环
select { //多路复用器,从多个channel操作中选择一个执行
case <-ticker.C: //这里定义了一个case,监听名为ticker的定时器生成的channel
task()
}
}
}
func main(){
go init() // 异步协程
}
- 创建一个cron调度器,在新的goroutine中启动cron调度器,确保调度器的Start方法不会阻塞init函数
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func myTask() {
fmt.Println("通过Cron执行的定时任务")
}
func init() {
c := cron.New(cron.WithSeconds()) // 创建一个新的cron调度器,并启用秒级精度
// 在新的goroutine中启动cron调度器,确保调度器的Start方法不会阻塞init函数
go func() {
// 添加一个定时任务,每5秒执行一次myTask函数
// "*/5 * * * * *": 这是一个cron表达式,用于描述任务的执行频率。
c.AddFunc("*/5 * * * * *", myTask)
// 启动cron调度器,开始执行已添加的任务
c.Start()
}()
}
func main() {
go init() // 异步协程
}