Go定时器的三种实现方式

2022-12-29 10:34:23 | 来源:

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

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定时器的三种实现方式

世界热点!这一冷门板块大爆发!

A股震荡收跌,电力旅游强势上行,关注安全与创新、疫后修复两条主线

热点!光伏股早盘集体走高,截至发稿,信义能源(03868.HK)涨9.33%,报2.46港元

环球聚焦:四大坚果分别是指什么?

当前速读:正邦科技: 第七届监事会第五次会议决议公告

​机器学习数据不满足同分布,怎么整?

割的双眼皮,上眼皮增生了怎么办? 资讯推荐

叮当钱包借款逾期八年会上征信吗

热议:三星新材(603578.SH)三名董事高管共减持2.1万股 减持期满

“阳康”后多久能运动?遇到其他毒株,会二次感染吗?医生解答来了|当前简讯

华夏野村日经225ETF净值下跌1.37% 请保持关注_焦点

新鲜的香菇要怎么做才好吃 香菇的做法

环球播报:钢价大涨近200!确定了,元旦之前,钢价这样走...

横琴首个垃圾分类主题大型艺术展开展

最新新闻

Go定时器的三种实现方式

世界热点!这一冷门板块大爆发!

A股震荡收跌,电力旅游强势上行,关注安全与创新、疫后修复两条主线

热点!光伏股早盘集体走高,截至发稿,信义能源(03868.HK)涨9.33%,报2.46港元

环球聚焦:四大坚果分别是指什么?

当前速读:正邦科技: 第七届监事会第五次会议决议公告

​机器学习数据不满足同分布,怎么整?

割的双眼皮,上眼皮增生了怎么办? 资讯推荐

叮当钱包借款逾期八年会上征信吗

热议:三星新材(603578.SH)三名董事高管共减持2.1万股 减持期满

“阳康”后多久能运动?遇到其他毒株,会二次感染吗?医生解答来了|当前简讯

华夏野村日经225ETF净值下跌1.37% 请保持关注_焦点

新鲜的香菇要怎么做才好吃 香菇的做法

环球播报:钢价大涨近200!确定了,元旦之前,钢价这样走...

横琴首个垃圾分类主题大型艺术展开展

紫天科技14亿买豌豆尖尖收问询函 标的评估增值836% 环球新要闻

最新快讯!珠江股份:公司将结合市场机会及经营需要,合理铺排融资计划

环球关注:邮你贷借款逾期二年延迟还款征信会怎么样

环球头条:同兴达: 深圳同兴达科技股份有限公司关于股东减持股份的进展公告

A股早评:沪指开盘涨0.57% 地产板块大幅高开居前

福建加快氢能产业高质量发展 有序推进交通领域示范应用_全球微动态

地素时尚(603587)12月21日主力资金净卖出111.71万元

大地海洋董秘回复:截至2022年12月20日,公司共有股东4200户

中国广西大寨村和重庆荆竹村入选联合国世界旅游组织“最佳旅游乡村”

【世界报资讯】银保监会:警惕房贷置换经营贷“转贷降息”陷阱

时隔19个月后,阿娇再谈失败的婚姻,公婆才是痛点_天天消息

浙江建投(002761.SZ):子公司中标34.92亿元的香港房屋协会启德房屋发展项目|头条

【天天聚看点】奚梦瑶素颜近照曝光,分享名牌包显阔气,身体恢复快被催生二胎

滚动:柳药集团:12月16日获融资买入795.32万元,占当日流入资金比例12.29%

歌星李琼:当年红极一时,现在胖到认不出,婚姻成谜