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
(計時器已經停止?。┎⑶夷鷩L試耗盡通道(但由于計時器已經停止,這將永遠阻塞)。
如何解決這個問題取決于你的目標;我懷疑你是想重置定時器?如果沒有,你可以這樣做:
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 關注
- 153 瀏覽
添加回答
舉報