go cron定时任务的基本使用讲解

 更新时间:2023年06月21日 10:42:19   作者:开发运维玄德公  
这篇文章主要为大家介绍了gocron定时任务的基本使用讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1. 基本使用

引用包: "github.com/robfig/cron/v3"

1.1 初始化实例 new()

  • 语法
func New(opts ...Option) *Cron
  • 语法示例
c := cron.New()

1.2 添加定时任务 AddFunc()

  • 语法
func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error)
  • 语法示例
c.AddFunc("* * * * *", func() { fmt.Println("====== 招募完成: 士兵 +1 =======") })

1.3 开始定时任务 Start()

  • 语法
func (c *Cron) Start()
  • 语法示例
c.Start()

1.4 完整示例

  • 代码
package main
import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)
func main()  {
    //c := cron.New(cron.WithSeconds())
    c := cron.New()
    c.Start()
    fmt.Println(time.Now())
    c.AddFunc("* * * * *", func() { fmt.Println(time.Now(),"====== 招募完成: 士兵 +1 =======") })
    c.AddFunc("*/5 * * * *", func() { fmt.Println(time.Now(),"====== 招募完成: 伍长 +1 =======") })
    select {}
}
  • 结果

2022-12-16 16:40:32.155401624 +0800 CST m=+0.000051359
2022-12-16 16:41:00.012072936 +0800 CST m=+27.856722654 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:42:00.061328164 +0800 CST m=+87.905977883 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:43:00.003474685 +0800 CST m=+147.848124410 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:44:00.059798048 +0800 CST m=+207.904447766 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:45:00.06000457 +0800 CST m=+267.904654288 ====== 招募完成: 伍长 +1 =======
2022-12-16 16:45:00.060084718 +0800 CST m=+267.904734436 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:46:00.042836167 +0800 CST m=+327.887485885 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:47:00.000225283 +0800 CST m=+387.844875007 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:48:00.000241943 +0800 CST m=+447.844891661 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:49:00.040677982 +0800 CST m=+507.885327700 ====== 招募完成: 士兵 +1 =======
2022-12-16 16:50:00.00034055 +0800 CST m=+567.844990268 ====== 招募完成: 伍长 +1 =======

1.5 第一次执行定时任务的契机

如上可见,定时任务第一次执行的时候是程序开始的第一个契机:

  • 16:40:32 程序开始执行。
  • 16:41:00 是一个整分钟,每分钟招募士兵开始执行。
  • 16:45:00 是开始后,第一个整五分钟,因此五分钟执行一次的招募伍长开始执行。

1.6 spec 的设置

  • 语法

五个值分别为:

分钟 小时 日 月 星期

  • 使用示例
* * * * * //每分钟执行
00 */3 * * *  //每隔3小时执行
10 03 * * *   //每天凌晨3点10分(00:10)执行
00 02 * * 7  //每周日凌晨2:00 执行
00 02 14 2 7  //每年2月14日凌晨2:00  或 每周日凌晨2:00 执行(最后一位0和7 都表示周日)
00 02 2,5,8 * *  //每月2,5,8号的2:00 执行
00 02 1-8 * *  //每月1到8号的凌晨2:00 执行

2. 粒度到秒

2.1 语法示例

  • 初始化
c := cron.New(cron.WithSeconds())
  • spec

最左一位是秒,其他和之前分钟粒度相同。

2.2 完整示例

  • 代码
package main
import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)
func main()  {
    c := cron.New(cron.WithSeconds())
    fmt.Println(time.Now())
    c.AddFunc("*/7 * * * * *", func() { fmt.Println(time.Now(),"====== 建造完成: 投石车 +1 =======") })
    c.AddFunc("*/3 * * * * *", func() { fmt.Println(time.Now(),"====== 招募完成: 士兵   +1 =======") })
    c.Start()
    select {}
}
  • 结果

2022-12-16 17:29:26.672306792 +0800 CST m=+0.000036478
2022-12-16 17:29:27.001131052 +0800 CST m=+0.328860748 ====== 招募完成: 士兵   +1 =======
2022-12-16 17:29:28.000333997 +0800 CST m=+1.328063678 ====== 建造完成: 投石车 +1 =======
2022-12-16 17:29:30.000180946 +0800 CST m=+3.327910638 ====== 招募完成: 士兵   +1 =======
2022-12-16 17:29:33.002458758 +0800 CST m=+6.330188430 ====== 招募完成: 士兵   +1 =======
2022-12-16 17:29:35.000249936 +0800 CST m=+8.327979610 ====== 建造完成: 投石车 +1 =======
2022-12-16 17:29:36.000311745 +0800 CST m=+9.328041418 ====== 招募完成: 士兵   +1 =======
2022-12-16 17:29:39.002463183 +0800 CST m=+12.330192861 ====== 招募完成: 士兵   +1 =======
2022-12-16 17:29:42.000297949 +0800 CST m=+15.328027640 ====== 建造完成: 投石车 +1 =======
2022-12-16 17:29:42.000353037 +0800 CST m=+15.328082842 ====== 招募完成: 士兵   +1 =======
2022-12-16 17:29:45.00024908 +0800 CST m=+18.327978755 ====== 招募完成: 士兵   +1 =======
2022-12-16 17:29:48.002469543 +0800 CST m=+21.330199229 ====== 招募完成: 士兵   +1 =======

如上可见:

  • 17:29:26 程序开始执行
  • 17:29:27 ,27秒是第一个3秒的整倍数,每隔3秒 招募一个士兵的任务开始执行
  • 17:29:35,35秒是第一个7秒的整倍数,每隔7秒 建造一个投石车的任务开始执行。

3. 按时间间隔

3.1 语法

符号说明示例
@yearly每年执行
@monthly每月执行
@weekly每周执行
@daily每天执行
@hourly每小时执行
@every指定间隔"@every 1h25m"

3.2 完整示例(@every)

  • 代码
package main
import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)
func main()  {
    c := cron.New(cron.WithSeconds())
    fmt.Println(time.Now())
    c.AddFunc("@every 1m", func() { fmt.Println(time.Now(),"====== 建造完成: 投石车 +1 =======") })
    c.Start()
    select {}
}

结果

如下可见,和前文“基本使用”中示例的执行契机不同。会在程序启动后一分钟执行,而不是在下一个一分钟的整倍数执行。

  • 程序在09:53:11启动,在一分钟之后(09:54:11)执行第一次
  • 如果是基本使用中的方法:程序在09:53:11启动,会在09:54:00 执行第一次

2022-12-21 09:53:11.620438535 +0800 CST m=+0.000041561
2022-12-21 09:54:11.008589266 +0800 CST m=+59.388192276 ====== 建造完成: 投石车 +1 =======
2022-12-21 09:55:11.052366134 +0800 CST m=+119.431969148 ====== 建造完成: 投石车 +1 =======
2022-12-21 09:56:11.008584381 +0800 CST m=+179.388187390 ====== 建造完成: 投石车 +1 =======
2022-12-21 09:57:11.018895862 +0800 CST m=+239.398498872 ====== 建造完成: 投石车 +1 =======
2022-12-21 09:58:11.018836287 +0800 CST m=+299.398439302 ====== 建造完成: 投石车 +1 =======
2022-12-21 09:59:11.008604569 +0800 CST m=+359.388207580 ====== 建造完成: 投石车 +1 =======
2022-12-21 10:00:11.006091578 +0800 CST m=+419.385694593 ====== 建造完成: 投石车 +1 =======
2022-12-21 10:01:11.010293781 +0800 CST m=+479.389896790 ====== 建造完成: 投石车 +1 =======

3.3 完整示例

  • 代码
package main
import (
    "fmt"
    "github.com/robfig/cron/v3"
    "time"
)
func main()  {
    c := cron.New(cron.WithSeconds())
    fmt.Println(time.Now())
    c.AddFunc("@weekly", func() { fmt.Println(time.Now(),"====== 建造完成: 投石车 +1 =======") })
    c.Start()
    select {}
}
  • 结果

时间太长等不来了

以上就是gocron定时任务的基本使用讲解的详细内容,更多关于gocron定时任务的资料请关注脚本之家其它相关文章!

相关文章

  • Go实现后台任务调度系统的实例代码

    Go实现后台任务调度系统的实例代码

    平常我们在开发API的时候,前端传递过来的大批数据需要经过后端处理,如果后端处理的速度快,前端响应就快,反之则很慢,影响用户体验,为了解决这一问题,需要我们自己实现后台任务调度系统,本文将介绍如何用Go语言实现后台任务调度系统,需要的朋友可以参考下
    2023-06-06
  • golang中sync.Map并发创建、读取问题实战记录

    golang中sync.Map并发创建、读取问题实战记录

    这篇文章主要给大家介绍了关于golang中sync.Map并发创建、读取问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • GO语言中err接口及defer延迟异常处理分析

    GO语言中err接口及defer延迟异常处理分析

    这篇文章主要为大家介绍了GO语言中err接口及defer延迟异常处理的示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Go Gin框架中的路由组及其优先级探索分析

    Go Gin框架中的路由组及其优先级探索分析

    在构建Web应用程序时,理解和有效地使用路由是至关重要的,Go语言的Gin框架为此提供了强大的工具,特别是通过其路由组功能,本文将深入探讨Gin的RouterGroup,特别是在路径匹配和优先级方面的行为
    2024-01-01
  • 通过Golang实现linux命令ls命令(命令行工具构建)

    通过Golang实现linux命令ls命令(命令行工具构建)

    这篇文章主要为大家详细介绍了如何通过Golang实现一个linux命令ls命令(命令行工具构建),文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-01-01
  • go json编译原理XJSON实现四则运算

    go json编译原理XJSON实现四则运算

    这篇文章主要为大家介绍了go json编译原理XJSON实现四则运算示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Golang 语言高效使用字符串的方法

    Golang 语言高效使用字符串的方法

    这篇文章主要介绍了Golang 语言高效使用字符串的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Golang实现拓扑排序(DFS算法版)

    Golang实现拓扑排序(DFS算法版)

    这篇文章主要介绍了Golang实现拓扑排序(DFS算法版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 详解Go语言微服务开发框架之Go chassis

    详解Go语言微服务开发框架之Go chassis

    分布式系统中每个进程的动态配置管理及运行时热加载就成为了一个亟待解决的问题。go chassis汲取了netflix的archaius框架经验,并做出来自己的创新特性。
    2021-05-05
  • Golang中的Unicode与字符串示例详解

    Golang中的Unicode与字符串示例详解

    这篇文章主要给大家介绍了关于Golang中Unicode与字符串的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Golang具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05

最新评论