有问题用法
package main
import (
"encoding/json"
"fmt"
"sync/atomic"
"time"
)
func demo() {
for {
select {
case <-time.After(time.Second * 1):
println("1s timer")
case <-time.After(time.Second * 2):
println("2s timer")
}
}
}
func main() {
go demo()
select {}
}
看到2s的定时器一直没有执行,原因就是 select 每次执行都会重新执行 case 条件语句,并重新注册到 select ,每次都会新构造一个 Timer 对象,所以2秒的定时器永远不会执行。而且会造成内存的泄露。这样的设计倒是也有好处,定时器可用于另一个chan的超时处理
正确用法
code
func demo(t1 interface{}, t2 interface{}) {
for {
select {
case <-t1.(*time.Ticker).C:
println("1s timer")
case <-t2.(*time.Ticker).C:
println("2s timer")
}
}
}
func main() {
t1 := time.NewTicker(time.Second * 1)
t2 := time.NewTicker(time.Second * 2)
go demo(t1, t2)
select {}
}
可以看到两个定时器都可以正常运行
引用
https://blog.csdn.net/x356982611/article/details/80425030
https://blog.csdn.net/wl2002200/article/details/54565211
https://godoc.org/time#After