3.11 Go之使用通道响应计时器事件
由于go中的goroutine的设计,定时任务可以再goroutine中通过同步的方式进行也可以通过异步回调完成
- 
同步进行 
- 
异步回调 
延迟回调
使用time包下的time.AfterFunc函数提供了该条件。传入一个时间再传入一个函数那么再过了这个时间以后就会执行闭包的函数
package main
import (
    "fmt"
    "time"
)
/*
1、声明一个通道
2、使用time包下的函数进行异步回调操作
 */
func main() {
    // 声明一个退出用的通道
    exit := make(chan int)
    // 开始打印
    fmt.Println("开始!")
    // 调用time包下的函数进行回调操作
    time.AfterFunc(5 * time.Second, func() {
        // 一秒后,打印结果
        fmt.Println("进入到匿名函数内!")
        // 将接收到的数据传入通道
        exit <- 0
    })
    // 匿名接收通道内的内容防止通道阻塞死锁
    <-exit
}
注意:
调用time.AfterFunc()函数,传入等待的时间和一个回调。回调使用一个匿名函数,在时间到达后,匿名函数会在另外一个 goroutine中被调用。
Time包中的相关函数
- 
time.AfterFunc()函数是在time.After基础上增加了到时的回调,方便使用。
- 
time.After()函数是在time.NewTimer()函数上进行的封装
定点计时
计时器
打点器
计时器(Timer)
原理:
类似倒计时闹钟,给定多少时间后触发--->触发一次--->返回time.Ticker对象
创建函数:
time.NewTicker()
打点器(Ticker)
原理:
类似钟表,没到整点就会触发--->每次到点就会触发--->返回time.Timer对象
通过一个C成员(这是一个只接收的时间通道<-chan Time)可获得时间触发的通知
创建函数:
time.NewTimer()
示例代码:
package main
import (
    "fmt"
    "time"
)
func main() {
    // 创建一个打点器
    ticker := time.NewTicker(1 * time.Second)
    // 创建一个计时器
    stopper := time.NewTimer(10 * time.Second)
    // 声明一个计数器
    var i int
    // 循环检查通道情况
    /*
    每次触发后,select会结束,需要使用循环再次从打点器返回的通道中获取触发通知。
     */
    for {
       // 判断多路复用
        select {
        case <-stopper.C:
            // 计时器到点了
            fmt.Println("停止!")
            // 跳转到退出
            goto Stop
        case <-ticker.C:
            // 记录打点器触发了多少次
            i++
            // 打印结果
            fmt.Println("打点次数:", i)
        }
    }
    // 定义退出标签
    Stop:
        fmt.Println("结束!")
}
    It's a lonely road!!!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号