天天观焦点:Go定时器的三种实现方式
时间:2022-12-29 16:20:16
很多时候需要周期性的执行某些操作,就需要用到定时器。定时器有三种思路。
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。最新文章推荐
- 市值超500亿元 兴发集团二季度净利预增10%-16%
- 提前结募!首单清洁能源公募REITs鹏华深圳能源REIT正式发行
- 郑州:多措并举促消费、扩投资、活出口 全力以赴夺取首季开门红
- 中央一号文件再聚焦乡村振兴:农村物流“最后一公里”要来了
- 券业“入门考试”迎规则修订拟调整成绩管理模式
- 郑州:多措并举促消费、扩投资、活出口 全力以赴夺取首季开门红
- 2025年 濮阳将建成数字经济和信息化发展新高地
- “一张蓝图”打造高校智慧校园“样板间” 中央民族大学这样做
- 江西财经大学“映山红”研究生支教团获第25届江西青年五四奖章
- “职等你来就业同行” 百日千万网络招聘行动启动
X 关闭
资讯中心
2022-08-29
2022-08-15
2022-05-20
2021-10-18
X 关闭
热点资讯
-
1
1月11日午后两市机构大单抢筹40股(名单)
-
2
【天天速看料】王俊凯疑坐实性丑闻!网传将被封杀,正在走程序,涉顶流女星杨幂
-
3
六福内地铂金多少钱一克(2023年01月10日)-世界消息
-
4
在岸离岸人民币对美元汇率双双升破“6.9” 专家预计本月将延续波动回升态势 每日速看
-
5
2023年首单!超126倍认购 嘉实京东仓储基础设施REIT吸金近720亿元 环球新资讯
-
6
环球观热点:叮当钱包借款逾期1年还不起会上征信系统吗
-
7
光华股份:公司主营粉末涂料用聚酯树脂,没有POE胶膜相关产品 看热讯
-
8
WD-40(WDFC.US):2023年Q1财报实现营收1.249亿美元_全球观天下
-
9
微粒贷逾期一年还不起征信会怎么样
-
10
基金:开年五连阳怎么办
-
11
赣州轻微工伤如何计算
-
12
5个案例:难以描述的需求,PRD越抹越黑?
-
13
世界观点:粤港跨境巴士恢复运行:恢复通关,感觉日子更有盼头
-
14
猫的英文怎么说 猫的英文是什么
-
15
今日热门!数据海报丨2022年长沙高质量发展报告·宜居之城品质倍升
-
16
英方软件(688435):首发网上路演时间 2023年1月9日(T-1日,周一)9:00~12:00
-
17
2021年12月几号有雪?
-
18
快播:特斯拉上海被曝停产一周,股票暴跌,到底发生什么了?
-
19
[快讯]乐心医疗发布解除质押公告
-
20
家政创业成功的3大核心,你了解吗?|速看