go开源宝藏go-cron定时任务(代码片段)

小生凡一 小生凡一     2023-02-01     618

关键词:

1. cron是什么

1.1 cron简介

cron:计划任务,其实就是定时任务
和系统约个时间,在几点几分几秒或者每隔一段时间跑一个任务(job),就那么简单。

1.2 cron详细语法

  • 结构

以下的结构来自维基百科

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

cron是一个字符串,一般分为几个域。字符串以56个空格隔开,分为67个域,每一个域代表一个含义,cron表达式有如下两种语法格式。

       秒     分钟    小时    日期      月份    星期    
1、Seconds Minutes Hours DayofMonth Month DayofWeek

      秒     分钟   小时    日期      月份    星期      年                                        
2、Seconds Minutes Hours DayofMonth Month DayofWeek Year
分钟小时日期月份星期年 (可选)
取值0 - 590 - 590 - 231 - 311 - 121 - 71970 - 2099
允许特殊字符, - * /, - * /, - * /, - * / ? L W C, - * /, - * / ? L C #, - * /
字符含义
?只能用在 DayofMonth 和 DayofWeek 两个域中,表示未说明的值,即不关心它为何值,用于解决DayofMonth 和 DayofWeek之间的冲突。因为DayofMonth 和 DayofWeek 会相互影响。例如cron表达式为* * * 20 * ?,则表示任务设置在每月的20日触发调度,不管20日到底是星期几都会触发,而如果把换成*,则表示不管星期几都会触发调度, 而DayofMonth又设置为20,表示只能在每个月的20日触发调度,这样就会引起冲突,所以必须要对其中一个设置? 来表示并不关心它为何值。
L表示last,只能出现在DayofMonth 和 DayofWeek域,例如:① 在DayofMonth域中使用L,则表示在当前月的最后一天触发一次。 ② 在DayofWeek域中使用L,则表示在当前月每周的星期六触发一次。
W只能用在月份中,表示最接近指定天的工作日 (周一到周五)。① 在DayofMonth域中使用5W 指 “最接近当前月第5天的工作日”。② 如果当前月的第5天是星期六,则将在最近的工作日:星期五,即当前月的第4天触发。③ 如果当前月的第5天是星期天,则在当前月的第6天(周一)触发;④如果当前月的第5天在星期一 到星期五之间,则就在当前月的第5天触发。⑤ W在寻找最近工作日是不会跨过月份。
  • 每分钟执行

*:表示匹配该域的任意值,假如在minute域中使用*,即表示每分钟都会触发事件。

* * * * *
  • 隔几分钟执行

一个 / 就能简单的表达了隔的意思,

*/3 * * * *
  • 从…到…
10-20 * * * * 每小时的 10-20 分执行

10-20/3 * * * * 在10-20 分钟这段时间,每3分钟执行一次
  • 指定时间段,可以用,来表示做某项任务,比如在2,4,6,19这几个时间段做任务。
2,4,6,19 * * * *
0 15 10 15 * ?  每月15日上午10:15触发 

0 15 10 ? * MON-FRI  周一至周五的上午10:15触发 

0 0 12 ? * WED   表示每个星期三中午12点 

2. 下载

github.com/robfig/cron

3. 使用

  • 导入
import "github.com/robfig/cron"
  • 创建
var Cron *cron.Cron
  • 执行
//每3秒执行一次
err := Cron.AddFunc("*/3 * * * * *", printHello)
func printHello() 
	fmt.Println("hello")

  • 启动一个定时器
	Cron.Start()

查看Start()源码可知,他是启动了一个协程的

所以我们加上了一个select进行阻塞。

	select 

package main

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

var Cron *cron.Cron

func main() 
	if Cron == nil 
		Cron = cron.New()
	

	//每3秒执行一次
	err := Cron.AddFunc("*/3 * * * * *", printHello)
	if err != nil 
		fmt.Println("err",err)
	
	Cron.Start()
	println("created cron job")
	select 


func printHello() 
	fmt.Println("hello")

  • 我们实际生产环境中的主进程是不会轻易结束的,所以在生产环境中不需要担心主进程的结束,而导致子进程结束的问题。

go开源宝藏go-swagger自动生成api接口文档(代码片段)

Go-Swagger写在前面1.使用2.API注释介绍3.请求部分4.响应部分写在前面安装goget-ugithub.com/swaggo/swag/cmd/swagGo-Swagger可以用来自动生成接口文档,减少大家编写接口文档的时间。1.使用先下载驱动goget-ugithub.com/swaggo/swag/cmd/swag头部导入... 查看详情

go开源宝藏go-doc自动生成项目结构目录(代码片段)

目录写在前面1.下载2.运行3.查看写在前面这个是可以自动生成项目的结构目录,方便后续开发人员的开发查看。1.下载goget-v-ugolang.org/x/tools/cmd/godoc2.运行在根目录下执行godoc-http=:60603.查看在浏览器中输入地址http://localhost:60... 查看详情

go开源宝藏十分强大的日志库logrus(代码片段)

文章目录1.写在前面2.简单例子3.HOOKS4.嵌入中间件1.写在前面这次所介绍的库是一个日志库github.com/sirupsen/logrus,是我们在web开发中,经常需要的库,因为我们的应用部署到线上出现问题的话,就需要用日志来进行... 查看详情

go开源宝藏十分强大的日志库logrus(代码片段)

文章目录1.写在前面2.简单例子3.HOOKS4.嵌入中间件1.写在前面这次所介绍的库是一个日志库github.com/sirupsen/logrus,是我们在web开发中,经常需要的库,因为我们的应用部署到线上出现问题的话,就需要用日志来进行... 查看详情

go开源宝藏jwt-go鉴权|中间件(文末送书嗷~)(代码片段)

🎉粉丝福利送书:《Go语言区块链应用开发从入门到精通》🎉点赞👍收藏⭐留言📝即可参与抽奖送书🎉下周三(9月22日)晚上20:00将会在【点赞区和评论区】抽一位粉丝送这本书~🙉🎉详情请... 查看详情

go开源宝藏cors跨域与csrf攻击|中间件(代码片段)

目录1.什么是跨域2.CSRF攻击2.1CSRF说明2.1原理3.CORS3.1简介3.2引用1.什么是跨域当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域当前页面url被请求页面url是否跨域原因http://www.test.com/http://www.test.com/index.... 查看详情

go开源宝藏gorm专场(含思维导图)|持续更新(代码片段)

写在前面本人只是一个Go语言的初学者,这篇文只是把我平常经常用到的都总结起来而已。具体详细的内容建议到去GORM的中文文档查看。当然这篇文章也会持续更新,记录我的CURD打磨过程这篇文章也会持续更新哒思维导... 查看详情

go开源宝藏web框架gin专场(含思维导图)|持续更新(代码片段)

写在前面本人只是一个Go语言的初学者,这篇总结只是把我平常经常用到的都总结起来而已。具体详细的内容建议到去GIN的中文文档查看。当然这篇文章也会持续更新,记录我的Web框架操练过程这篇文章也会持续更新哒思... 查看详情

go开源宝藏基于golang语法的性能调优技巧(字符串拼接)(代码片段)

文章目录字符串拼接参考链接字符串拼接我们一般使用字符串拼接方式有三种直接拼接str+="sum"fmt.Sprintf(“%s”,xxxxx)使用string.Builder使用bytes.Builder使用byte进行拼接我们先来写一个benchmark去测试每一种字符串拼接的情况... 查看详情

go开源宝藏go语言操作redis(代码片段)

目录1.Redis简介2.Go语言连接Redis3.String操作3.1Set&Get3.2Incr&Incrby3.2.1Incr加13.2.2Incrby加val3.3MSet&MGet3.4总结4.List操作4.1RPush4.2LLen&LRange4.3总结参考链接1.Redis简介Redis支持诸如字符串(strings)、哈希(hashes)、列... 查看详情

go开源宝藏基于golang语法的性能调优技巧(数组的遍历)(代码片段)

1.数组的遍历数组和切片的遍历方式一样,所以我们这里就不进行区分。我们一般用以下两种方式直接取下标方式fori:=0;i<len(nums);i++ ...我们先来讲一下这种方式,我们都知道数组在内存中存储是连续的。所以我... 查看详情

go动态定时任务api接口(代码片段)

go动态定时任务API接口使用连接数据库表,启动服务初始化所有定时任务,然后通过API接口动态修改定时任务。数据库表CREATETABLE`go_cron`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`time`varchar(100)DEFAULT‘‘COMMENT‘定时时间‘,`ip`varchar(100)DEFAULT... 查看详情

go——cron定时任务demo(代码片段)

源代码:https://gitee.com/shentuzhigang/mini-project/blob/master/cron_demo官方文档https://pkg.go.dev/github.com/robfig/cronDemopackagecron_demoimport( "fmt" "github.com/robfig/cron/v3" 查看详情

go语言中定时任务库cron使用详解(代码片段)

原创不易,未经允许,请勿转载。文章目录快速入门Cron表达式格式预定义时间表设置时区常用的方法介绍快速入门安装cron,注意这里安装的是v3版本。新版本和旧版时间使用有所区别gogetgithub.com/robfig/cron/v3@v3.0.0在... 查看详情

go语言中定时任务库cron使用详解(代码片段)

原创不易,未经允许,请勿转载。文章目录快速入门Cron表达式格式预定义时间表设置时区常用的方法介绍快速入门安装cron,注意这里安装的是v3版本。新版本和旧版时间使用有所区别gogetgithub.com/robfig/cron/v3@v3.0.0在... 查看详情

如何打断ticker定时器的阻塞状态(go)(代码片段)

简介      如下代码所示,一个线程负责处理定时任务,如果发生紧急事件需要打断当前正在阻塞等待执行的任务,可以通过重置另一个并行的定时器来打断阻塞。      代码很简单,备份自用packagemainimport( ... 查看详情

[15]深入浅出工作开源框架camunda:定时任务(代码片段)

1.引言在BPMN中,可以通过改变“TimerStartEvent”启动节点的启动类型来自动启动流程实例。其提供了下面三种定时自动触发流程实例的模式:指定固定的时间点启动一个新的流程实例指定相对延迟时间启动一个新的流程实... 查看详情

go使用go语言打造定时提醒小工具,从基础到优化全方位探索(代码片段)

...可以轻松地编写高并发应用程序,而无需关注底层细节。开源社区:GO语言拥有一个强大的开源社区,因此可以使用各种可用的库和工具来帮助开发人员快速完成任务。跨平台支持:GO语言可以跨多个操作系统和硬件架构运行,... 查看详情