下载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定时任务简单实现的更多相关文章

  1. mysql定时任务简单例子

    mysql定时任务简单例子 ? 1 2 3 4 5 6 7 8 9     如果要每30秒执行以下语句:   [sql] update userinfo set endtime = now() WHE ...

  2. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  3. Quartz定时任务简单实例

    文章纲要: 初步搭建一个由Quartz为引擎集群的定时任务模块,功能为每隔30秒打印一条信息(Hello World!!!) 一.环境 Spring MVC Mevan Quartz 2.2.1 二. ...

  4. 代码片段 - Golang 实现简单的 Web 服务器

    ------------------------------ 下面一段代码,实现了最简单的 Web 服务器: 编译环境: Linux Mint 18 Cinnamon 64-bit Golang 1. ...

  5. Asp.net core与golang web简单对比测试

    最近因为工作需要接触了go语言,又恰好asp.net core发布RC2,就想简单做个对比测试. 下面是测试环境: CPU:E3-1230 v2 内存:16G 电脑有点不给力 操作系统:Centos7 ...

  6. golang从简单的即时聊天来看架构演变

    前言 俗话说的好,架构从来都不是一蹴而就的,没有什么架构一开始设计就是最终版本,其中需要经过很多步骤的变化,今天我们就从一个最简单的例子来看看,究竟架构这个东西是怎么变的. 我将从一个最简单的聊天室的 ...

  7. Linux中的定时任务简单操作实例

    今天,我怀着一颗感恩的心,写了一个小小的定时任务,细想还是写个简单的例子吧,希望能帮到你! 首先我在/usr/local/文件夹下创建了一个文件,hah.sh文件 在hah.sh里面编写shell脚本 ...

  8. Go语言入门篇-gRPC基于golang & java简单实现

    一.什么是RPC 1.简介: RPC:Remote Procedure Call,远程过程调用.简单来说就是两个进程之间的数据交互. 正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者 ...

  9. Golang 实现简单的滚动读取文本更新

    这个小程序要实现的效果,简单地说,就是将目标文件的内容读取输出到终端,并且目标文件并不是静态的,而是随时会添加新的内容.我们的目标就是一旦目标文件添加了新的内容,就把它读取出来并且显示到终端上. 实现 ...

随机推荐

  1. 二分查找LintcodeNo14

    14First Position of Target 二分查找的基础题 STL lower_bound实现 class Solution { public: /** * @param nums: Th ...

  2. Maven 基础(一) | 使用 Maven 的正确姿势

    一.什么是 Maven? Maven 是一个项目管理工具,它的本质是一个项目对象模型(POM),体现在配置中就是我们常见的 pom.xml 文件,而这个 pom 文件就是 Maven 的核心,它管理了 ...

  3. CF - 一直交换元素的规律

    Dima is a beginner programmer. During his working process, he regularly has to repeat the following ...

  4. Lambda表达式(lambda expression)⭐⭐⭐⭐⭐

    原作者 lambda表达式(lambda expression)实际上是匿名函数一种表示形式, 即没有函数名的函数:参数列表=>表达式或语句块,在我看来主要目是为了简化代码编写,提高代码可读性而 ...

  5. CDH安装详细测试正确

    1. CDH简介 简单来说,Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到 ...

  6. $.fn.serializeObject对为disabled属性的失效

    问题现象: 在查生产tomcat下的localhost日志时,发现今天的记录有不少次都报org.apache.ibatis.exceptions.TooManyResultsException: Ex ...

  7. python StringIO和ByteIO

    一.StringIO 1.作用:在内存在读写str # 导入模块 from io import StringIO # 实例化StringIO对象 str_io = StringIO() # 向内存中写 ...

  8. noip2018 考前提醒!

    适应Noilinux 1.终端操作 打开终端 \(Ctrl+Alt+T\) 打开文件夹 \(cd\) +名称 新建文件夹 \(mkdir\) +名称 打开 \(vim\) 配置 \(vim ~/.vi ...

  9. 【Oracle】复制表结构和表数据

    1.既复制表结构也复制表数据:CREATE TABLE tab_new AS SELECT * FROM tab_old; 2.只复制表结构:CREATE TABLE tab_new AS SELEC ...

  10. doT 这个模板 是怎么实现的?(1)