下载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. Hyperledger Fabric1.4 安装

    Hyperledger Fabric 依赖的软件版本查看官方 github 地址 https://github.com/hyperledger/fabric 下文件 /docs/source/prer ...

  2. Netty快速入门(02)Java I/O(BIO)介绍

    BIO简介 Java I/O,也叫Blocking I/O,也就是阻塞式I/O. BIO的流程比较简单,在服务端创立一个ServerSocket去监听,等待连接.客户端创建一个Socket连接过来,服 ...

  3. EF 使用lambda表达式 更新一对多数据时报错

    1.需求  更新一对多表中的附表数据,表结构如下: 2.思路 个人觉得一个个去对比关联的附表数据是删除还是添加比较麻烦,就直接清空主表关联的附表,然后重新建立关联关系. 3.弊端 如果附表(前提是附表 ...

  4. 揭发233的docker/machine

    继手动滑稽之golang-vmware-driver广告篇,今天把vmware-driver完成 然而我却要发一篇牢骚,这是对docker公信力的挑战!!! 本来很简单的升级到vmware 15.x的 ...

  5. Golang 正则匹配 -- regexp

    匹配特殊字符 //re :=regexp.MustCompile("[~!@#$%^&*(){}|<>\\\\/+\\-[]:\"?'::''"&qu ...

  6. [apue] 作为 daemon, 启动 Unix Domain Socket 侦听失败?

    前段时间写一个传递文件句柄的小 demo,有 server 端.有 client 端,之间通过 Unix Domain Socket 通讯. 在普通模式下,双方可以正常建立连接,当server端作为d ...

  7. python 枚举类型

    在python中枚举是一种类(Enum,IntEnum),存放在enum模块中.枚举类型可以给一组标签赋予一组特定的值. 枚举的特点: 枚举类中不能存在相同的标签名 枚举是可迭代的 不同的枚举标签可以 ...

  8. 区间dp - 括号匹配并输出方案

    Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...

  9. excel中为什么不显示单引号

    解决:打两个就可以了!因为:一个单引号表示该单元格为文本属性.

  10. java 运行和编译

    一.编译->运行 1.编译 javac  文件名.java  生成 文件名.class 2.运行 java 文件名 注意:正在运行的是 文件名.class 因此:修改源文件后,要先编译,再运行 ...