这是使用Timer的goroutine泄漏吗?

问题描述 投票:0回答:1

参见 gobyexample.com 的示例:https://gobyexample.com/timers

timer2 := time.NewTimer(time.Second)
go func() {
    <-timer2.C
    fmt.Println("Timer 2 fired")
}()
stop2 := timer2.Stop()
if stop2 {
    fmt.Println("Timer 2 stopped")
}

问题:停止计时器后

go func()
永远卡住了?如果是,处理这种情况的正确方法是什么?

go
1个回答
0
投票

如果计时器在触发之前停止,goroutine 将继续等待。您必须使用另一个通道或上下文来停止它:

done:=make(chan struct{})
go func() {
    select {
        case <-timer2.C:
            fmt.Println("Timer 2 fired")
        case <-done:
    }
}()
stop2 := timer2.Stop()
close(done)
© www.soinside.com 2019 - 2024. All rights reserved.