Skip to content

corn

在 Go 中,cron 通常用于表示定时任务的调度器,类似于 Unix/Linux 系统中的 cron 工具。通过定时调度器,可以定期执行某些任务,如清理日志、定时备份、定时发送邮件等。

Go 标准库没有内置支持 Cron 的功能,但是可以使用第三方库来实现类似的功能。最常用的库之一是 robfig/cron,它提供了一个类似 Unix cron 表达式的调度器,能够精确控制任务的执行时间。

1. 安装 robfig/cron

你可以通过以下命令安装 robfig/cron 库:

bash
go get github.com/robfig/cron/v3

2. 使用 robfig/cron 实现定时任务

robfig/cron 允许你使用 Cron 表达式来定义定时任务。Cron 表达式的格式如下:

*    *    *    *    *    <command-to-execute>
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +---- Day of the week (0 - 7) (Sunday = 0 or 7)
|    |    |    +--------- Month (1 - 12)
|    |    +-------------- Day of the month (1 - 31)
|    +------------------- Hour (0 - 23)
+------------------------ Minute (0 - 59)

2.1 基本使用示例

go
package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 定义一个任务:每分钟执行一次
	_, err := c.AddFunc("@every 1m", func() {
		fmt.Println("Task executed at:", time.Now())
	})
	if err != nil {
		fmt.Println("Error adding cron job:", err)
		return
	}

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

	// 让主程序等待
	select {}
}

在这个示例中:

  • cron.New():创建一个新的 Cron 调度器实例。
  • c.AddFunc("@every 1m", ...):添加一个定时任务,@every 1m 是一个简化的 Cron 表达式,表示每 1 分钟执行一次。你也可以使用标准的 Cron 表达式,如 "0 0 * * *",表示每天午夜执行一次。
  • c.Start():启动 Cron 调度器,开始执行定时任务。
  • select {}:主线程阻塞,以保持程序持续运行,避免程序退出。

2.2 使用 Cron 表达式

你可以使用标准的 Cron 表达式来定义任务的执行频率。例如:

  • "0 0 * * *":每天午夜执行。
  • "*/5 * * * *":每 5 分钟执行一次。
  • "0 9-17 * * 1-5":每周一到周五,上午 9 点到下午 5 点的每小时执行一次。

以下是使用标准 Cron 表达式的示例:

go
package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 使用 Cron 表达式:每天凌晨 1 点执行任务
	_, err := c.AddFunc("0 1 * * *", func() {
		fmt.Println("Daily task executed at:", time.Now())
	})
	if err != nil {
		fmt.Println("Error adding cron job:", err)
		return
	}

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

	// 让主程序等待
	select {}
}

2.3 定时任务的停止与管理

你可以在程序中动态管理任务,例如暂停、取消定时任务。

go
package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 添加定时任务
	jobID, err := c.AddFunc("*/5 * * * *", func() {
		fmt.Println("Task executed at:", time.Now())
	})
	if err != nil {
		fmt.Println("Error adding cron job:", err)
		return
	}

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

	// 模拟 15 秒后停止任务
	time.Sleep(15 * time.Second)

	// 取消定时任务
	c.Remove(jobID)
	fmt.Println("Task removed")

	// 让主程序等待
	select {}
}

在这个示例中:

  • jobID, err := c.AddFunc(...):添加任务并返回任务 ID。
  • c.Remove(jobID):使用任务 ID 移除已经添加的任务。

2.4 执行一次任务(非周期性)

如果你只希望任务执行一次,可以使用 AddFunc 添加一个立即执行的任务。通过传入 @once 来表示任务只执行一次。

go
package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 定义一次性任务
	_, err := c.AddFunc("@once", func() {
		fmt.Println("This task runs once at:", time.Now())
	})
	if err != nil {
		fmt.Println("Error adding cron job:", err)
		return
	}

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

	// 让主程序等待
	select {}
}

在这个示例中,@once 表示任务只会在 Cron 启动时立即执行一次。

3. 其他 Cron 表达式示例

  • @every 1h:每小时执行一次。
  • 0 0 1 * *:每月的第一天执行一次。
  • */15 * * * *:每 15 分钟执行一次。

4. 总结

robfig/cron 是 Go 中最常用的第三方库,用于实现定时任务调度。它支持标准的 Cron 表达式,允许你灵活地控制任务的执行时间。通过 Cron,你可以轻松地实现定期任务、延迟任务和一次性任务等。

常见的应用场景包括:

  • 定期执行清理任务(例如清理临时文件)。
  • 定时备份数据库或文件。
  • 定期发送报告或邮件提醒。

安装命令

bash
go get github.com/robfig/cron/v3