1 回答
TA贡献1834条经验 获得超8个赞
添加一些额外的输出可以帮助您定位问题:
case data := <-p.ch:
fmt.Println("Got Data", len(p.queue), p.maxSize)
if len(p.queue) < p.maxSize {
p.queue = append(p.queue, data)
}
if !p.timer.Stop() {
fmt.Println("Draining")
<-p.timer.C
}
p.queue = make([]interface{}, 0)
}
使用该更改运行输出为:
Got Data 5 5
Got Data 0 5
Addding
Draining
因此正在处理两条消息(第一条不会输出,Adding
因为len(p.queue)
它是 5;这是因为您将其初始化为大小为 5 - make([]interface{}, maxSize)
)。考虑收到消息时代码在做什么:
处理
queue
停止计时器
翻拍
queue
现在从文档中获取timer.Stop()
:
Stop 阻止 Timer 触发。如果调用停止计时器,它返回 true ,如果计时器已经过期或停止,则返回 false 。
在第一次迭代中,它起作用了(计时器停止,如有必要,通道被耗尽)。但是,您在停止计时器后不会重置计时器,因此在第二次迭代时,当您调用时计时器已经停止p.timer.Stop()
。这意味着Stop()
它将返回false
(计时器已经停止!)并且您尝试耗尽通道(但由于计时器已经停止,这将永远阻塞)。
如何解决这个问题取决于你的目标;我怀疑你是想重置定时器?如果没有,你可以这样做:
if p.timer.C != nil && !p.timer.Stop() {
fmt.Println("Draining")
<-p.timer.C
}
p.timer.C = nil // Timer has been stopped (nil channel will block forever)
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报