我有一个空闲超时计时器在goroutine中被select,在看到活动时,我想取消计时器。
我查看了文档,但不确定是否理解正确。
Stop函数可以阻止计时器触发。如果调用成功停止计时器,则返回true;如果计时器已经过期或已停止,则返回false。Stop函数不会关闭通道,以防止从通道读取成功。
为了防止在调用Stop后NewTimer创建的计时器触发,请检查返回值并清空通道。例如,假设程序还没有从t.C接收:
如果!t.Stop(),则需要清空通道:<-t.C
这不能与计时器通道的其他接收并发完成。
我试图理解何时必须手动清空通道。
以下是我的理解,如有错误请指出:
如果Stop返回false,则表示:
我查看了文档,但不确定是否理解正确。
Stop函数可以阻止计时器触发。如果调用成功停止计时器,则返回true;如果计时器已经过期或已停止,则返回false。Stop函数不会关闭通道,以防止从通道读取成功。
为了防止在调用Stop后NewTimer创建的计时器触发,请检查返回值并清空通道。例如,假设程序还没有从t.C接收:
如果!t.Stop(),则需要清空通道:<-t.C
这不能与计时器通道的其他接收并发完成。
我试图理解何时必须手动清空通道。
以下是我的理解,如有错误请指出:
如果Stop返回false,则表示:
- 计时器已经停止了
- 在这种情况下,从通道中读取将会阻塞,所以我不应该这样做
- 计时器已经过期了
- 由于我有另一个goroutine监听此通道,我能确定它是否已经收到事件吗?
- 从文档的"这不能与其他接收并发地完成"部分来看,似乎这不是一个选项,那么我该怎么办?
在我的情况下,从计时器获得一个多余的事件并不是什么大问题,这是否可以告诉我在这里该做什么?
context.Context
与设置了截止时间的监听goroutine传递,并在需要时从外部取消它。 - kostixselect
结构和一个专门用于此目的的context.WithCancel
... - Elias Van Ootegemcontext.WithCancel
,谢谢你指出来。后来我想到了一种更符合惯用法的解决问题的方法,不需要在单独的例程中处理计时器。 - Motti