Go并发编程(八)go定时器
Go的标准包time里提供了两种定时器,一种是标准定时器,另一种是循环定时器。
标准定时器timer
timer在到达指定时间时仅仅触发一次,当timer到期时会将当前时间发送到自己的C管道,timer实例必须通过NewTimer或AfterFunc
timer := time.NewTimer(time.Second * 3)
延迟执行:
第一种实现
time.sleep(3 * time.Second)
使用After模拟超时:After到达指定时间后会向内置C管道发送当前时间
func TestMyTime() {
c := make(chan struct{})
go func() {
time.Sleep(3 * time.Second)
<- c
}()
// select case可以是发送可以是接收
select {
case c <- struct{}{}:fmt.Println("channel")
case <- time.After(5 * time.Second):fmt.Println("超时啦")
close(c)
}
}
第二种实现:使用AfterFunc,返回timer对象,可用来关闭定时器
func TestTimeAfterFunc() {
c := make(chan struct{})
timer := time.AfterFunc(3 * time.Second, func() {
fmt.Println("经过3秒后执行该函数")
c <- struct{}{}
})
<- c
timer.Stop()
}
循环定时器Tick
time包中的循环定时器都是永久执行的定时器,直到手动关闭它。time中没有可以指定次数的循环定时器。会根据时间频率不断发送时间到返回的管道
func TestTick() {
ticker := time.NewTicker(time.Second * 1)
wg := sync.WaitGroup{}
wg.Add(10)
for t := range ticker.C {
fmt.Printf("Backup at %s\n", t)
wg.Done()
}
wg.Wait()
}