golang定时器


Posted in Golang onApril 14, 2022

定时器1-"*/5 * * * * *"

package main
import (
	"fmt"

	"github.com/robfig/cron"
)
//主函数
func main() {
	cron2 := cron.New() //创建一个cron实例
	//执行定时任务(每5秒执行一次)
	err:= cron2.AddFunc("*/5 * * * * *", print5)
	if err!=nil{
		fmt.Println(err)
	}
	//启动/关闭
	cron2.Start()
	defer cron2.Stop()
	select {
	//查询语句,保持程序运行,在这里等同于for{}
	}
}
//执行函数
func print5()  {
	fmt.Println("每5s执行一次cron")
}

设置说明

┌─────────────second 范围 (0 - 60)
 │ ┌───────────── min (0 - 59)
 │ │ ┌────────────── hour (0 - 23)
 │ │ │ ┌─────────────── day of month (1 - 31)
 │ │ │ │ ┌──────────────── month (1 - 12)
 │ │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
 │ │ │ │ │ │                  Saturday)
 │ │ │ │ │ │
 │ │ │ │ │ │
 * * * * * *

星号(*) :表示 cron 表达式能匹配该字段的所有值。如在第5个字段使用星号(month),表示每个月

斜线(/):表示增长间隔,如第2个字段(minutes) 值是 3-59/15,表示每小时的第3分钟开始执行一次,之后 每隔 15 分钟执行一次(即 3(3+0*15)、18(3+1*15)、33(3+2*15)、48(3+3*15) 这些时间点执行),这里也可以表示为:3/15

逗号(,):用于枚举值,如第6个字段值是 MON,WED,FRI,表示 星期一、三、五 执行

连字号(-):表示一个范围,如第3个字段的值为 9-17 表示 9am 到 5pm 直接每个小时(包括9和17)

问号(?):只用于 日(Day of month) 和 星期(Day of week),表示不指定值,可以用于代替 *

定时器2-Timer-Ticker

Timer  //时间到了产生一次事件
Ticker  //时间到了循环产生事件

Timer-只执行一次

package main
import (
	"fmt"
	"time"
)
func main() {
	//创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间)
	timer := time.NewTimer(2 * time.Second)
	fmt.Println("当前时间:", time.Now())
	//2s后,往timer.C写数据,有数据后,就可以读取
	t := <-timer.C //channel没有数据前后阻塞
	fmt.Println("t = ", t)
}

Ticker-循环执行

package main
import (
	"fmt"
	"time"
)
//验证time.NewTimer(),时间到了,只会响应一次
func main() {
	timer := time.NewTicker(1 * time.Second)
	for {
		<-timer.C
		fmt.Println("时间到")
	}
}

结果:

时间到
时间到
时间到
时间到

Timer延时功能

time.NewTimer(2 * time.Second)  //相当于time.Sleep(2 * time.Second)
func main() {
	//延时2s后打印一句话
	timer := time.NewTimer(2 * time.Second)
	<-timer.C
	fmt.Println("时间到")
}
func main() {
	<-time.After(2 * time.Second) //定时2s,阻塞2s, 2s后产生一个事件,往channel写内容
	fmt.Println("时间到")
}

停止和重置定时器

ok := timer.Reset(1 * time.Second) //重新设置为1s
timer.Stop() //停止定时器

停止:

func main() {
	timer := time.NewTimer(3 * time.Second)
	go func() {
		<-timer.C
		fmt.Println("子协程可以打印了,因为定时器的时间到")
	}()
	timer.Stop() //停止定时器
	for {
	}
}

重置:

func main() {
	timer := time.NewTimer(3 * time.Second)
	ok := timer.Reset(1 * time.Second) //重新设置为1s
	fmt.Println("ok = ", ok)
	<-timer.C
	fmt.Println("时间到")
}

定时器Ticker使用

package main
import (
	"fmt"
	"time"
)
func main() {
	ticker := time.NewTicker(1 * time.Second)
	i := 0
	for {
		<-ticker.C
		i++
		fmt.Println("i = ", i)
		if i == 5 {
			ticker.Stop()
			break
		}
	}
}

以上就是go语言定时器的功能使用示例详解的详细内容!

Golang 相关文章推荐
golang import自定义包方式
Apr 29 Golang
golang switch语句的灵活写法介绍
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
golang语言指针操作
Apr 14 Golang
Golang 实现WebSockets
Apr 24 Golang
深入理解 Golang 的字符串
May 04 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 #Golang
golang语言指针操作
Apr 14 #Golang
golang使用map实现去除重复数组
Apr 14 #Golang
golang生成并解析JSON
Apr 14 #Golang
Go语言 详解net的tcp服务
Apr 14 #Golang
golang连接MySQl使用sqlx库
Apr 14 #Golang
Go语言安装并操作redis的go-redis库
Apr 14 #Golang
You might like
Smarty+QUICKFORM小小演示
2007/02/25 PHP
最新的php 文件上传模型,支持多文件上传
2009/08/13 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
PHP Session机制简介及用法
2014/08/19 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
javascript html5 canvas实现可拖动省份的中国地图
2016/03/11 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
javascript时间差插件分享
2016/07/18 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
JS中关于正则的巧妙操作
2017/08/31 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
工作骂脏话检讨书
2014/10/05 职场文书
2015年行政工作总结范文
2015/04/09 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python
JavaScript组合继承详解
2021/11/07 Javascript
聊聊redis-dump工具安装问题
2022/01/18 Redis
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS