go 定时任务 gocron timer
选型推荐(DeepSeek)
简单任务调度: 推荐使用 cron 或 gocron,它们轻量且易用。
复杂任务调度: 推荐使用 go-quartz,支持任务依赖和持久化。
分布式任务调度: 推荐使用 asynq,基于 Redis 实现,适合分布式场景。
任务状态监控: 推荐使用 jobrunner,提供 Web 界面查看任务状态。
gocron 示例
import (
"fmt"
"time"
"github.com/go-co-op/gocron"
)
func jobFunc() {
fmt.Println("任务执行啦!")
}
func main() {
fmt.Println("main ...")
s := gocron.NewScheduler(time.UTC)
// 每分钟执行一次任务
// s.Every(1).Second().Do(jobFunc)
// 每天的固定时间执行任务
// s.Every(1).Day().At("10:30").Do(jobFunc)
// 3S后执行一次
now := time.Now().Add(3 * time.Second)
s.Every(1).Second().StartAt(now).LimitRunsTo(2).Do(jobFunc)
s.StartAsync()
time.Sleep(time.Second * 7)
fmt.Println("success ...")
}
Timer定时器
// +main ...
// 2025-02-12 16:25:58.8250935 +0800 CST m=+0.004155201
// 2025-02-12 16:26:00.8560862 +0800 CST m=+2.035117201
// 2025-02-12 16:26:03.8679151 +0800 CST m=+5.046900601
// 2025-02-12 16:26:05.873156 +0800 CST m=+7.052111201
// success ...
func main() {
fmt.Println("main ...")
// 当前时间打印
t1 := time.Now()
fmt.Println(t1.String())
timer1 := time.NewTimer(2 * time.Second)
// 阻塞延迟2S
t2 := <-timer1.C
fmt.Println(t2.String())
// 重置,重新延迟3S
timer1.Reset(3 * time.Second)
t2 = <-timer1.C
fmt.Println(t2.String())
// 如果没到时间 关闭timer
// if timer1.Stop() {
// fmt.Println("close timer success")
// }
// 阻塞延迟2S
t3 := <-time.After(2 * time.Second)
fmt.Println(t3.String())
fmt.Println("success ...")
}