全球热点评!Go定时器的三种实现方式

2022-12-30 04:40:22 来源: 分享到:

很多时候需要周期性的执行某些操作,就需要用到定时器。定时器有三种思路。


(资料图片)

Sleep

使用休眠,让当前Goroutine休眠一定的时间来实现定时的效果,缺点是程序执行速度不均匀,导致定时周期不均匀。

for{fmt.Println(time.Now())time.Sleep(time.Second*1)}

Timer

Go语言的内置包,指定一个时间开始计时,时间到之后会向外发送通知,发送通知的方式就是使用<-chan Time返回内容。

第一种方式,直接在需要等待处使用,效果和Sleep一样,一使用就卡在那了内部就是使用了Timer。

fmt.Println(time.Now())<-time.After(1*time.Second)fmt.Println(time.Now())

也可以把他拆分开,在任意地方进行等待

timer:=time.NewTimer(1*time.Second)<-timer.Cfmt.Println(time.Now())

但是以上只是做到延迟一次性执行,我们来改造一下,把他变成定时器。

done:=make(chanstruct{})timer:=time.NewTimer(1*time.Second)gofunc(){for{select{case<-timer.C:fmt.Println(time.Now())timer.Reset(1*time.Second)case<-done:return}}}()<-time.After(5*time.Second+time.Millisecond*100)done<-struct{}{}

定义子Goroutine的目的是为了防止形成死锁,让定时器最终能退出,在实际项目中可能需要一个永久运行的定时器,一般为了不影响项目主逻辑也会这样定义。如果你的项目就是定时任务,我建议也这么写,这样可以注册很多个定时器互不影响。done是为了判断执行是否结束,防止主Goroutine提前退出。这个示例只有两个case,实战中如果有加其他case需要给每个case内都做一次Reset,保证重置定时器。Ticker

相比上述使用延迟执行功能实现的定时器,Ticker本身就是一个定时器(内部封装了Timer),我们使用起来就非常简单。

ticker:=time.NewTicker(1*time.Second)gofunc(){for{<-ticker.Cfmt.Println(time.Now())}}()<-time.After(5*time.Second+time.Millisecond*100)ticker.Stop()

在select 一节中讲述的官方超时控制方案非常的实用,也是使用的此函数。还使用到timer.Stop和timer.Reset这两个内置函数这里就不展开讲解了,建议进行复习。

小结

定时器一般用来周期性执行任务,比如定时同步数据、计算报表、发送通知。

time.Sleep使用休眠,让当前goroutine休眠一定的时间来实现定时的效果,缺点是内部逻辑执行的速度会影响到定时器的时间差,无法做到精确间隔。Timer类似于Sleep的延迟处理,通过channel来获得通知,也可以改造成定时器。因为是延迟处理,所以要记得重置时间来实现定时执行的效果。Ticker现成的定时器,内部也是封装了 Timer。

全球热点评!Go定时器的三种实现方式

来源: 2022-12-30 04:40:22

今日关注:积成电子最新公告:与参股公司积成能源签署合作协议

来源: 2022-12-29 19:44:02

世界球精选!桂发祥12月29日主力资金大幅流出

来源: 2022-12-29 17:43:04

全球信息:融捷股份董秘回复:公司目前产销情况正常,有关公司的具体生产经营数据可关注公司以后披露的定期报告

来源: 2022-12-29 16:02:09

环球动态:勘设股份:投资者朋友公司曾在雄安承接过业务,项目均已完成

来源: 2022-12-29 13:49:37

【全球聚看点】山高环能: 关于向银行申请并购借款由全资子公司提供担保的更正公告

来源: 2022-12-29 11:38:17

世界观天下!本地人都不敢买?印度制造智能手机当地需求下降8%

来源: 2022-12-29 09:52:01

热点在线丨跃岭股份: 独立董事关于聘任公司财务总监的独立意见

来源: 2022-12-28 17:27:03

每日视讯:2022年中国内燃机行业进口贸易分析 行业进口需求有望进一步下降【组图】

来源: 2022-12-28 14:49:18

环球速讯:车企造电池哪家强?比亚迪、上汽、广汽各有招

来源: 2022-12-28 10:47:46

世界球精选!主动作为讲担当 精准施策抓服务

来源: 2022-12-28 06:50:14

世界头条:南都电源(300068.SZ):股东王岳能减持数过半 已减持27.9573万股

来源: 2022-12-27 19:15:18

焦点热议:会计凭证附件粘贴方法是什么

来源: 2022-12-27 15:38:29

观点:浙江检察机关依法对沈德咏涉嫌受贿案提起公诉

来源: 2022-12-27 10:10:26

全球热消息:广西交通肇事赔偿标准?

来源: 2022-12-27 01:26:53

天天微动态丨融e贷贷款逾期29年延迟还款征信会怎么样

来源: 2022-12-26 16:48:41

环球即时:警惕“帮忙资金”帮倒忙

来源: 2022-12-26 11:11:06

焦点速看:真是烦死这些垃圾网站了!

来源: 2022-12-26 02:27:19

焦点短讯!买爆款防疫神器小心安全隐患

来源: 2022-12-25 10:40:20

全球信息:最大CLIP!LAION发布CLIP的扩增定律

来源: 2022-12-24 12:18:04

天天看热讯:小赢钱包借款逾期三年拖欠多久会上征信系统

来源: 2022-12-23 20:27:24

视焦点讯!过期的酒糟用途 过期的酒糟有啥妙用

来源: 2022-12-23 15:24:44

全球热点评!极市直播预告丨NeurIPS 2022 Oral-张博航:如何从模型层面获得对抗鲁棒性保证?

来源: 2022-12-23 09:21:39

焦点速看:天力锂能最新公告:签署项目及智能自动化控制生产线总包合同

来源: 2022-12-22 20:40:21

天天热消息:金一文化(002721)12月22日主力资金净买入519.41万元

来源: 2022-12-22 15:14:03

今日热文:西王食品(000639)12月21日主力资金净买入365.51万元

来源: 2022-12-22 08:53:09

天天微动态丨武汉初级会计证书在哪领取

来源: 2022-12-21 19:09:47

视点!黔医人才计划为贵州培养762名医学人才和管理骨干

来源: 2022-12-21 13:51:41

天天微速讯:渤海钻探四项成果达到国际先进水平

来源: 2022-12-21 07:49:18

焦点!腾讯遭北水抛售超9亿港元!快手、美团也遭沽出

来源: 2022-12-20 18:22:43

Copyright   2015-2022 西南知识产权网 版权所有  备案号:皖ICP备2022009963号-8   联系邮箱:39 60 29 14 2@qq.com