GO语言定时任务实战-gocron包

news2024/9/28 17:27:47

文章目录

  • 1. 基本使用
    • 1.1 初始化实例 new()
    • 1.2 添加定时任务 AddFunc()
    • 1.3 开始定时任务 Start()
    • 1.4 完整示例
    • 1.5 第一次执行定时任务的契机
    • 1.6 spec 的设置
  • 2. 粒度到秒
    • 2.1 语法示例
    • 2.2 完整示例
  • 3. 按时间间隔
    • 3.1 语法
    • 3.2 完整示例(@every)
    • 3.3 完整示例

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

1. 基本使用

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 1h15m”

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 {}

}
  • 结果

时间太长等不来了


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AcWing 4721. 排队(单调栈+二分法)

问题描述 n 个小朋友排成一排,从左到右依次编号为 1∼n。 第 i 个小朋友的身高为 hi。 虽然队伍已经排好,但是小朋友们对此并不完全满意。 对于一个小朋友来说,如果存在其他小朋友身高比他更矮,却站在他右侧的情况&#xff0c…

【闲聊杂谈】纤程的概念

首先要明白几个概念:程序、进程、线程、纤程。 如果要非常严格的定义上来说的话,进程是操作系统用来做资源调度的基本单位。后来发现进程的切换是在的太费资源了,于是诞生了线程;线程多了来回切换还是很费资源,于是又…

[Linux]Linux项目自动化构建工具-make/Makefile

🥁作者: 华丞臧. 📕​​​​专栏:【LINUX】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉 LeetCode刷题网站 文…

FX5U-相对定位指令DRVI(DDRVI )两种写法

该指令通过增量方式(采用相对地址的位置指定),进行1速定位。 以当前停止的位置作为起点,指定移动方向和移动量(相对地址)进行定位动作。如果驱动触点置为ON,则输出脉冲,并开始从偏置速度进行加速动作。到达指令速度后,以指令速度进…

【LeetCode】N皇后-回溯

N皇后-回溯N皇后题目示例分析代码N皇后II题目示例分析代码总结N皇后 题目 LeetCode 51.N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间…

第二篇 - Vue 的初始化流程

一,前言 上篇,使用 rollup 完成了 Vue2 源码环境的搭建 本篇,介绍 Vue 的初始化流程 二,Vue 简介 以两个概念性问题做简单介绍 1,问题:Vue 是 MVVM 框架吗? 在 Vue 官网上是这样说的&#…

LeetCode450之删除二叉搜索树中的节点(相关话题:二叉搜索树,删除)

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤&#x…

VS封装C++项目以及属性配置

目录 1. 封装单个项目 1.1 封装 新建C空项目,将需要封装的源文件(eval.cpp)和 头文件(eval.h)复制过来,并对它们做如下修改: 注:如果有多个头文件和源文件,只对可供外部调用的文件及其内部的函数作下面的处理 分别…

1.c++环境配置及第一个环境运行

开发IDE与环境 最好是使用ubuntu系统进行开发,如果没有的话,基于windows使用vs code 进行ssh连接到远程的ubuntu主机进行开发也可以。开发的过程跟本地差不多。 vs code IDE 插件的安装 1.变成中文菜单与提示,安装MS-CEINTL.vscode-language-pack-zh-…

《MySQL系列-InnoDB引擎13》文件-参数文件

文件 MySQL数据和InnoDB存储引擎表中的各种类型的文件,这些文件如下: 参数文件:MySQL启动时的数据库文件,指定初始化参数,介绍各种参数类型,以及定义某种内存结构的大小等日志文件:用来记录My…

C语言日常练习

这里写目录标题循环结构输入两个正整数m和n,求其最大公约数和最小公倍数求Snaaaaaaaaaa……的值,其中a是一个数字,n表示a的个数,n和a都由键盘输入一维数组从键盘输入十个数,并将正着输出反着输出从键盘输入十个数&…

虹科案例 | 解决ASRS系统的痛点问题居然这么简单?(上)

摘要 ASRS(自动存储和检索系统)在内部物流领域变得越来越常见。内部物流包括优化、整合、自动化和管理履行或配送中心内的货物物流流动。 ASRS穿梭机经常用在具有多个存储级别的配送中心的仓库或库存集装箱中处理散装产品的托盘。 自动化存储和检索系统的定义是专门为物料的存…

springcloud-02-微服务间通信及熔断组件

第二章 微服务间通信及熔断组件 1. 微服务间通信组件 1.1 基于RestTemplate的服务调用 Spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只…

初识 Node.js

1、回顾与思考 1.1、浏览器中的 JavaScript 的组成部分 1.2、思考:为什么 JavaScript 可以在浏览器中被执行 1.3、思考:为什么 JavaScript 可以操作 DOM 和 BOM 1.4、浏览器中的 JavaScript 运行环境 2、Node.js 简介 2.1、什么是 Node.js Node.js…

RSA加密算法完整加密流程

RSA完整加密流程总结1.1-RSA加密介绍RSA公钥加密算法是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时…

实习------Spring 框架学习

Spring 是什么(了解) 在不同的语境中,Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度,对 Spring 进行介绍。 广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。 经过十多年的发展&…

【原创】升级需谨慎,开发两行泪!——记一次MySQL驱动包升级引发的事故

一、背景最近项目组在版本迭代时,组件也要进行升级,此时涉及到MySQL驱动包jdbc的版本升级。即从5.1.X升级到8.0.X。然鹅在上线之后就出现了一部分兼容性问题,造成了一次“事故”:调用接口出现“系统错误”。查看日志:j…

C. Least Prefix Sum(可以后悔的拿取+multiset)

Problem - C - Codeforces 波罗的海,一个著名的棋手,同时也是一个数学家,他有一个数组a1,a2,...,an,他可以进行以下几次(可能是0次)操作。 选择某个索引i(1≤i≤n)。 将ai与-1相乘&…

Ffmpeg中AVFrame数据保存成YUV--讨论AVFrame的linesize

目录 YUV播放器 AVFrame中保存成YUV实现 linesize的意义 实测(PC机-64bits-win10) 总结: YUV播放器 首先要有一个YUVplayer用来播放测试的YUV数据,雷神改良过的YUV播放器: 修改了一个YUV/RGB播放器_雷霄骅的博客-CSDN博客 播放器播放界…

查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示,这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。bin\pg_dump --dbnamepostgresql://dbuser:123456localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql pg_dump: 错误: 查询失败: 閿欒…