网站首页 > 开源技术 正文
Go语言中文网,致力于每日分享编码知识,欢迎关注我,每天一起进步!
Cron定时任务
项目地址:https://github.com/EDDYCJY/go...
如果对你有所帮助,欢迎点个 Star 或赞
在实际的应用项目中,定时任务的使用是很常见的。你是否有过 Golang 如何做定时任务的疑问,莫非是轮询?
在本文中我们将结合我们的项目讲述 Cron
介绍
我们将使用 cron 这个包,它实现了 cron 规范解析器和任务运行器,简单来讲就是包含了定时任务所需的功能
Cron 表达式格式
Cron表达式表示一组时间,使用 6 个空格分隔的字段
可以留意到 Golang 的 Cron 比 Crontab 多了一个秒级,以后遇到秒级要求的时候就省事了
Cron 特殊字符
1、星号 ( * )
星号表示将匹配字段的所有值
2、斜线 ( / )
斜线用户 描述范围的增量,表现为 “N-MAX/x”,first-last/x 的形式,例如 3-59/15 表示此时的第三分钟和此后的每 15 分钟,到59分钟为止。即从 N 开始,使用增量直到该特定范围结束。它不会重复
3、逗号 ( , )
逗号用于分隔列表中的项目。例如,在 Day of week 使用“MON,WED,FRI”将意味着星期一,星期三和星期五
4、连字符 ( - )
连字符用于定义范围。例如,9 - 17 表示从上午 9 点到下午 5 点的每个小时
5、问号 ( ? )
不指定值,用于代替 “ * ”,类似 “ _ ” 的存在,不难理解
预定义的 Cron 时间表
安装
$ go get -u github.com/robfig/cron
实践
在上一章节 Go Web 框架 Gin 实践10—定制 GORM Callbacks 中,我们使用了 GORM 的回调实现了软删除,同时也引入了另外一个问题
就是我怎么硬删除,我什么时候硬删除?这个往往与业务场景有关系,大致为
- 另外有一套硬删除接口
- 定时任务清理(或转移、backup)无效数据
在这里我们选用第二种解决方案来进行实践
编写硬删除代码
打开 models 目录下的 tag.go、article.go文件,分别添加以下代码
1、tag.go
2、article.go
注意硬删除要使用 Unscoped(),这是 GORM 的约定
编写Cron
在 项目根目录下新建 cron.go 文件,用于编写定时任务的代码,写入文件内容
在这段程序中,我们做了如下的事情
1、cron.New()
会根据本地时间创建一个新(空白)的 Cron job runner
2、c.AddFunc()
AddFunc 会向 Cron job runner 添加一个 func ,以按给定的时间表运行
会首先解析时间表,如果填写有问题会直接 err,无误则将 func 添加到 Schedule 队列中等待执行
3、c.Start()
在当前执行的程序中启动 Cron 调度程序。其实这里的主体是 goroutine + for + select + timer 的调度控制哦
4、time.NewTimer + for + select + t1.Reset
如果你是初学者,大概会有疑问,这是干嘛用的?
(1)time.NewTimer
会创建一个新的定时器,持续你设定的时间 d 后发送一个 channel 消息
(2)for + select
阻塞 select 等待 channel
(3)t1.Reset
会重置定时器,让它重新开始计时
(注意,本文适用于 “t.C已经取走,可直接使用 Reset”)
总的来说,这段程序是为了阻塞主程序而编写的,希望你带着疑问来想,有没有别的办法呢?
有的,你直接 select{} 也可以完成这个需求 :)
验证
检查输出日志正常,模拟已软删除的数据,定时任务工作OK
小结
定时任务很常见,希望你通过本文能够熟知 Golang 怎么实现一个简单的定时任务调度管理
可以不依赖系统的 Crontab 设置,指不定哪一天就用上了呢
参考
本系列示例代码
- go-gin-example
本系列作者:煎鱼,原创授权发布
猜你喜欢
- 2024-10-26 浅谈Kubernetes CRD和Operator的原理和使用方法
- 2024-10-26 笨办法学物联网之四:99个物联网动手实践项目
- 2024-10-26 Linux入门常用必会60个命令实例详解(一)
- 2024-10-26 Kubernetes任务调用Job与CronJob及源码分析
- 2024-10-26 linux 常用cron检测脚本(linux查询crontab)
- 2024-10-26 作业帮 K8s Serverless 虚拟节点大规模应用实践
- 2024-10-26 火山引擎 Redis 云原生实践(火山引擎app)
- 2024-10-26 当 GoLand 遇到 Kubernetes:如何调试和运行 Go 程序
- 2024-10-26 Go 每日一库之 jobrunner(github每日一题)
- 2024-10-26 golang cron 定时任务(go语言定时任务)
你 发表评论:
欢迎- 05-14WP8.1 GDR1的NTP时间同步没有解决问题
- 05-14抑郁症与焦虑症(四):补充色氨酸,5HTP的作用
- 05-14ntp服务器多久同步一次呢
- 05-14简单三步,轻松解决NVR时间不同步问题
- 05-14Linux的300+个真实运维场景——19 NTP 配置与管理
- 05-14海康威视录像机时间不准怎么办录像机无法查看回放录像,NTP校时
- 05-14安全加倍,解密极氪001电池安全技术
- 05-14海康威视录像机NTP服务器
- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)