Golang定时任务简单实现
下载cron包:
go get github.com/robfig/cron
开启一个定时:
根据cron表达式进行时间调度,cron可以精确到秒,大部分表达式格式也是从秒开始。
c := cron.New()默认从分开始,所以加上cron.WithSeconds(),保证定时按照表达式字面意思执行。
func main() {
c := cron.New(cron.WithSeconds()) //精确到秒
//定时任务
spec := "*/1 * * * * ?" //cron表达式,每秒一次
c.AddFunc(spec, func() {
fmt.Println("11111")
})
c.Start()
select {} //阻塞主线程停止
}
停止定时:
由于goroutine没有线程id,所以无法从外部停止指定的定时任务。cron自带Stop()方法,支持在方法体里使用,来停止当前定时。
何时调用Stop()方法,需要根据自身业务触发,例如运行完成100次后停止,数据库当前状态为注销时停止,等等。
func main() {
c := cron.New(cron.WithSeconds()) //精确到秒
//定时任务
spec := "*/1 * * * * ?" //cron表达式,每秒一次
c.AddFunc(spec, func() {
status := getStatus() //获取定时任务的状态
if status == true {
fmt.Println("11111")
} else {
c.Stop() //当前定时任务状态已注销
}
})
c.Start()
select {} //阻塞主线程停止
}
开启多个定时:
一个c对象可以加载多个定时任务,此时在其中一个方法里调用Stop()方法,所有定时任务都会停止。
func main() {
c := cron.New(cron.WithSeconds()) //精确到秒
//定时任务
spec := "*/1 * * * * ?" //cron表达式,每秒一次
c.AddFunc(spec, func() {
fmt.Println("11111")
})
spec1 := "*/5 * * * * ?" //cron表达式,每5秒一次
c.AddFunc(spec1, func() {
fmt.Println("22222")
})
c.Start()
select {} //阻塞主线程停止
}
常见cron表达式:
表达式如果算上年份,共7位:
秒 分 时 日 月 周 年
实际应用中很少用到年份,所以一般表达式都是6位:
秒 分 时 日 月 周
*/1 * * * * ? 每秒
00 * * * * ? 每分
00 30 22 * * ? 每天晚上22:30
00 30 22 * * 2 每周二晚上22:30
00 30 22 * * 1,3 每周一和周三晚上22:30
*/5 35 10 * * 1-3 每周一到周三上午10点35分00秒开始第一次,然后每5秒一次
00 10,40 14 ? 3 4 每年三月的星期四的下午14:10和14:40
需要更复杂更细致的表达式写法,可自行上网查找。
注意:
网上有很多不同的cron包,同一个包版本也有多个,整体用法虽相似,但对cron表达式的处理会有一定差别,例如c := cron.New()有直接从秒开始的,不用加cron.WithSeconds(),也有用5位长度来指定表达式的。
所以,具体使用哪个包,最好下载更新最新版本,表达式的语法也要通过实际测试进行验证,保证任务按照我们指定的时间执行。
公众号:李田路口
Golang定时任务简单实现的更多相关文章
- mysql定时任务简单例子
mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9 如果要每30秒执行以下语句: [sql] update userinfo set endtime = now() WHE ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- Quartz定时任务简单实例
文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...
- 代码片段 - Golang 实现简单的 Web 服务器
------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1. ...
- Asp.net core与golang web简单对比测试
最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7 ...
- golang从简单的即时聊天来看架构演变
前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的. 我将从一个最简单的聊天室的 ...
- Linux中的定时任务简单操作实例
今天,我怀着一颗感恩的心,写了一个小小的定时任务,细想还是写个简单的例子吧,希望能帮到你! 首先我在/usr/local/文件夹下创建了一个文件,hah.sh文件 在hah.sh里面编写shell脚本 ...
- Go语言入门篇-gRPC基于golang & java简单实现
一.什么是RPC 1.简介: RPC:Remote Procedure Call,远程过程调用.简单来说就是两个进程之间的数据交互. 正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者 ...
- Golang 实现简单的滚动读取文本更新
这个小程序要实现的效果,简单地说,就是将目标文件的内容读取输出到终端,并且目标文件并不是静态的,而是随时会添加新的内容.我们的目标就是一旦目标文件添加了新的内容,就把它读取出来并且显示到终端上. 实现 ...
随机推荐
- beetlex网关之聚合和url请求过虑
在这里主要介绍beetlex应用网关的两个插件,分别是聚合和url请求过虑.通过聚合插件可以把整合多个请求的数据来应答请求端,而Url请求过虑同可以拒绝一些有非常关键字的请求. 请求聚合 在网关服务中 ...
- JSON小记
json: { "1" : "2", "1" : "3" } 在json中如果有重复的key,会取最后一个key的值,如 ...
- 在GeneXus开发过程中如何进行自动化测试?
1. 简介 GXtest是基于专门为GeneXus平台开发的应用程序提供的自动化测试解决方案. 我们强调“解决方案”和“自动化”两个词: 解决方案:GXtest为整个GeneXus软件开发生命周期提供 ...
- 2019年面试官最喜欢问的28道ZooKeeper面试题
前言 ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. ZooKeeper 的 ...
- 【红外DDE算法】聊聊红外图像增强算法的历史进程(第一回)
宽动态红外图像增强算法综述回顾过去带你回顾宽动态红外图像增强算法的历史进程,历来学者的一步步革命(新的算法框架提出),一步步改革(改进优化),从简单粗暴到细致全面.正所谓是:改革没有完成时,只有进行时 ...
- Identity 4 -1创建一个登录中心
准备知识 官网地址:https://identityserver4.readthedocs.io/ 通过nuget安装 Identity Server4
- Java数组合并方法学习。
参考博客: https://blog.csdn.net/liu_005/article/details/72760392 https://blog.csdn.net/jaycee110905/arti ...
- java小心机(6)| 多态的一些坑
对于"多态"的概念,想必大家都很熟悉了,但我们还是来回顾一下吧 class Actor { public void act(){ System.out.println(" ...
- jquery的版本 纵多 , 各个版本的插件的融合 ,
有些插件在哪些版本下没有 插件之间因为版本冲突 是得不偿失的事情
- 深入Node模块Buffer-学会操作二进制
Buffer 作为 nodejs 中重要的概念和功能,为开发者提供了操作二进制的能力.本文记录了几个问题,来加深对 Buffer 的理解和使用: 认识缓冲器 如何申请堆外内存 如何计算字节长度 如何计 ...