一架梯子,一头程序猿,仰望星空!

Golang 定时任务库

通过本步骤指导学习 Golang 定时任务库,内容涵盖 CRON 表达式、特殊字符、预定义的时间表、间隔、时区和线程安全性。

1. 介绍

Golang cron 库是一个强大且易于使用的工具,允许在特定时间或间隔内调度任务运行。它是模仿 UNIX cron 服务设计的,但实现为一个独立的库,可以集成到 Go 应用程序中。cron 库负责基于时间的调度,让您可以专注于需要执行的任务。

2. 示例

安装 cron 库

要开始在项目中使用 cron 库,您需要首先使用 go get 命令进行安装:

go get github.com/robfig/cron/v3@v3.0.0

导入 cron 包

安装后,您可以按以下方式将其导入到您的 Go 程序中:

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

以下是一个设置 Cron 作业以每分钟打印一条消息的简单示例:

package main

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

func main() {
	c := cron.New()
	c.AddFunc("0 30 * * * *", func() { fmt.Println("每半个小时") })
	c.AddFunc("@hourly",      func() { fmt.Println("每小时") })
	c.AddFunc("@every 1h30m", func() { fmt.Println("每小时三十分钟") })
	c.Start()
	..
	// Funcs are invoked in their own goroutine, asynchronously.
	...
	// Funcs may also be added to a running Cron
	c.AddFunc("@daily", func() { fmt.Println("每天") })
	..
	..
	c.Stop()  // 停止调度器(不会停止已经运行的任何作业)。
}

3. CRON 表达式格式

cron 表达式代表一组时间,使用 6 个以空格分隔的字段。

字段 是否必须? 允许的值 允许的特殊字符
0-59 * / , -
0-59 * / , -
小时 0-23 * / , -
一个月的第几天 1-31 * / , - ?
月份 1-12 或 JAN-DEC * / , -
一周的第几天 0-6 或 SUN-SAT * / , - ?

4. CRON 表达式中的特殊字符

  • 星号(*) 星号代表给定字段的所有可能值。例如,分钟字段中的星号表示每分钟。
  • 斜杠(/) 斜杠字符用于指定增量。例如,秒字段中的 "*/15" 表示从零开始,每 15 秒运行一次。
  • 逗号(,) 逗号字符用于列出多个不连续的值。例如,一周中的 "MON, WED, FRI" 表示作业将在星期一、星期三和星期五运行。
  • 连字符(-) 连字符表示一系列值。“9-17” 在小时字段中表示从上午 9 点到下午 5 点的每小时。
  • 问号(?) 问号可以在一个月中的日期和一周中的日期字段中使用,表示“没有特定值”,这在您需要为一个指定值而不是另一个指定值时非常有用。

5. 预定义的计划

预定义计划的详细解释可在以下表格中找到:

条目 描述 等同于
@yearly(或 @annually) 每年运行一次,在午夜时分,1 月 1 日 0 0 0 1 1 *
@monthly 每月运行一次,在午夜时分,当月的第一天 0 0 0 1 * *
@weekly 每周运行一次,在周六和周日之间的午夜 0 0 0 * * 0
@daily(或 @midnight) 每天运行一次,在午夜时分 0 0 0 * * *
@hourly 每小时运行一次,从整点开始 0 0 * * * *

6. 时间间隔和固定间隔调度

使用cron库调度作业在固定时间间隔内执行是其另一个强大的功能。例如,要安排每2小时运行一次的作业:

c.AddFunc("@every 2h", func() { fmt.Println("每两小时运行一次作业") })

7. 时区和作业调度

解释和调度是在运行Go应用程序的计算机的本地时区中完成的。在夏令时更改期间,需要注意某些时间可能不存在或重复。

8. 线程安全和同步

cron库被设计为线程安全和并发的。调用者必须维护正确的方法调用顺序,以避免竞态条件。必须在必要时使用适当的同步机制,以确保作业被正确地调度和执行。


章节目录