Ticker
tick在不使用时,应手动stop,否则会造成timer泄露
func Tick(d Duration) <-chan Time
func NewTicker(d Duration) *Ticker
func (t *Ticker) Stop()
for t := range time.Tick(time.Second * 2){...}
ticker := time.NewTicker(time.Second * 2)
for {
select {
case t := <-ticker.C:
fmt.Println(t, "hello world")
}
}
tick的channel的cap是1,如果发送了多次,而没来得及接收,是不是只保留第一次发送的值?
--------------------------------------------------------------------------------
Timer
func After(d Duration) <-chan Time
func NewTimer(d Duration) *Timer
func (t *Timer) Reset(d Duration) bool
func (t *Timer) Stop() bool
time.After创建的timer会自动从timer堆中删除,通常直接用 <-time.After 是没问题的。但在for循环中要注意:
for {
select {
case <-time.After(time.Second): // 不好
println("time out, and end")
case <-ch:
}
}
如果ch始终都有值,那么每次循环,time.After都会分配一个新的timer,短时间内会创建大量无用的timer。
正确写法:
timer := time.NewTimer(time.Second)
for {
timer.Reset(time.Second)
select {
case <-timer.C:
println("time out, and end")
case <-ch:
}
}