【发布时间】:2018-10-17 19:47:20
【问题描述】:
var timer *time.Timer
func A() {
timer.Stop() // cancel old timer
go B() // new timer
}
func B() {
timer = time.NewTimer(100 * time.Millisecond)
select {
case <- timer.C:
// do something for timeout, like change state
}
}
函数 A 和 B 都在不同的 goroutine 中。
假设 A 在 RPC goroutine 中。当应用程序收到 RPC 请求时,它会取消 B 中的旧定时器,并在另一个 goroutine 中启动一个新的定时器。
医生说:
Stop 不会关闭通道,以防止从通道读取 错误地成功了。
那么如何打破B中的select以避免goroutine泄漏?
【问题讨论】:
-
请描述您要解决的高级问题。
-
你能详细说明你的问题吗?
-
@aerokite 超时时,切换到下一个状态。当收到请求时,保持状态并启动一个新的计时器。
-
@lxyscls 你对这段代码有什么真正的问题? 100ms 定时器不会停止。那又怎样?
-
只需使用取消渠道并同时选择