通道、超时和计时器(Ticker)
计时器(间隔指定时间发送一次数据)
time 包中有一些有趣的功能可以和通道组合使用,其中就包含了 time.Ticker 结构体,这个对象以指定的时间间隔重复的向通道 C 发送时间值:
import "time"
chRate := time.Tick(time.Second) //每秒向通道发送一次时间数据
for i:=0; i<10; i++ {
<- chRate // 每秒阻塞一次,限制后续匿名函数协程的使用
go func(i int) {
fmt.Println("Hell", i)
}(i)
}
time.Sleep(15)
定时器(指定时间后发送一次数据)
定时器 (Timer) 结构体看上去和计时器 (Ticker) 结构体的确很像(构造为 NewTimer(d Duration)
),但是它只发送一次时间,在 Dration d
之后。
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(1e8) // 计时发送
boom := time.After(5e8) // 定时发送
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(5e7)
}
}
}