😊杨鼎睿的笔记

Search

Search IconIcon to open search

golang timer reset 问题

Last updated Nov 11, 2022 Edit Source

# 摘要

定时器创建后是单独运行的,超时后会向通道写入数据,你从通道中把数据读走。当前一次的超时数据没有被读取,而设置了新的定时器,然后去通道读数据,结果读到的是上次超时的超时事件,看似成功,实则失败

所以使用 Reset 的时候,

1
2
3
4
if !t.Stop() {
	<-t.C 
} 
t.Reset(d)

然而这种方式会遇到问题 time: Timer.Reset is not possible to use correctly ,即如果计时器已经过期,且 channel 被取走数据,这个时候不要先调用 Stop()。

如果通过变量标明是否取出了数据,又会有竞态的问题,比如 goroutine 顺序完全依赖于调度器调度。 综上,没有 Reset() 完全理想的正确使用方式。

# 问题、提示

# 主要笔记