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 相关文章推荐
Go各时间字符串使用解析
Apr 02 Golang
golang中的空slice案例
Apr 27 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
解决golang 关于全局变量的坑
May 06 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
js交换排序 冒泡排序算法(Javascript版)
2014/10/04 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
详解React项目中碰到的IE问题
2019/03/14 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
django删除表重建的实现方法
2019/08/28 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
python3 logging日志封装实例
2020/04/08 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
EJB面试题
2015/07/28 面试题
个人授权委托书范文
2014/09/21 职场文书
学生检讨书范文
2014/10/30 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
2015年化验员工作总结
2015/04/10 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
医院消毒隔离制度
2015/08/05 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL