Go定时器的三种实现方式

2022-12-23 00:30:20

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

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。

x

热门推荐

宝马计划与韩国厂商进行合作 生产固态电池

2022-07

海南推动农贸市场全面落实禁塑 加强违禁塑料制品源头治理

2021-12

柴犬登登拍卖记:动物是如何被司法拍卖的

2021-12

江西:到2025年鄱阳湖区断面水质优良比例达到50%以上

2021-12

西藏森林消防:锻造雪域救援尖兵 打造高海拔山岳救援队伍

2021-12

加强人才融通发展 第10届海峡两岸水利青年工程交流营成功举办

2021-12

四川:空手夺刀救人的“95后”女民警捐献万元奖金传递爱心

2021-12

中国食品名市临沂坚持“三化融合” 争做“食安”守望者

2021-12

上海闵行一幼儿园教职工殴打幼儿 2名涉事人员已被行拘

2021-12

受贿1414万元 江西万载县委原书记胡全顺获刑11年6个月

2021-12

推荐阅读

Go定时器的三种实现方式

2022-12

当前热点-老年朋友警惕特应性皮炎冬季复发加重,病情稳定期老人可接种新冠疫苗

2022-12

【世界播资讯】STARTRADER外汇:关于,市盈率判断市场风险的话题!

2022-12

特稿:“期待尽快前往中国实地考察”——欧洲欢迎中国商务代表团密集造访|每日关注

2022-12

三特索道(002159)12月21日主力资金净买入490.81万元

2022-12

安凯客车(000868)12月20日主力资金净买入819.83万元

2022-12

蓝色光标: 独立董事关于第五届董事会第二十九次会议相关事项的独立意见_每日简讯

2022-12

Free Arch: 将 IdentityServer 部署到 Okteto

2022-12

众安小贷逾期4000延迟还款征信有什么影响_资讯推荐

2022-12

【世界热闻】支付宝上线“健康防疫”专区 集合多家互联网医院提供在线问诊等便民服务

2022-12