Golang Cron定时任务

在Golang中如何使用cron库实现定时任务?想每隔5分钟执行一次特定的函数,但不太清楚具体的写法。比如如何设置cron表达式,是否需要考虑并发安全,以及如何优雅地停止定时任务?最好能提供一个完整的示例代码。

2 回复

Golang中可使用github.com/robfig/cron/v3库实现定时任务。支持cron表达式,精确到秒级调度。示例:

c := cron.New()
c.AddFunc("*/5 * * * *", func() {
    fmt.Println("每5分钟执行")
})
c.Start()

适用于后台任务、定时清理等场景。

更多关于Golang Cron定时任务的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,你可以使用github.com/robfig/cron/v3库来创建和管理Cron定时任务。这是一个功能强大且广泛使用的库,支持标准Cron表达式。

安装

go get github.com/robfig/cron/v3

基本用法

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/robfig/cron/v3"
)

func main() {
	// 创建cron实例(默认本地时区)
	c := cron.New()

	// 添加定时任务
	// 每分钟执行一次
	_, err := c.AddFunc("* * * * *", func() {
		fmt.Printf("任务执行时间: %v\n", time.Now().Format("2006-01-02 15:04:05"))
	})
	if err != nil {
		log.Fatal("添加任务失败:", err)
	}

	// 每5秒执行一次(使用@every语法)
	_, err = c.AddFunc("@every 5s", func() {
		fmt.Println("每5秒执行的任务")
	})
	if err != nil {
		log.Fatal("添加任务失败:", err)
	}

	// 启动cron调度器
	c.Start()

	// 让程序运行一段时间(实际使用时可能需要其他方式保持运行)
	time.Sleep(5 * time.Minute)

	// 停止调度器(优雅关闭)
	c.Stop()
}

Cron表达式格式

标准格式:分 时 日 月 周

  • * * * * * - 每分钟
  • 0 * * * * - 每小时
  • 0 0 * * * - 每天午夜
  • 0 9 * * 1 - 每周一9:00

预定义调度

  • @every 1h30m - 每1小时30分钟
  • @yearly / @annually - 每年
  • @monthly - 每月
  • @weekly - 每周
  • @daily / @midnight - 每天
  • @hourly - 每小时

带参数的任务函数

func myTask(name string) {
	fmt.Printf("任务 %s 执行时间: %v\n", name, time.Now())
}

func main() {
	c := cron.New()
	
	// 使用cron.NewChain添加中间件(如恢复panic)
	_, err := c.AddFunc("@every 1m", func() {
		myTask("示例任务")
	})
	
	c.Start()
	defer c.Stop()
	
	// 保持程序运行
	select {}
}

注意事项

  1. 使用cron.New(cron.WithSeconds())可支持秒级精度
  2. 调用c.Stop()会等待正在执行的任务完成
  3. 考虑使用cron.WithLogger()添加日志记录
  4. 在生产环境中,建议添加恢复机制防止panic

这个库简单易用,适合大多数定时任务场景。

回到顶部