介绍 Golang Timer(定时器)

本文介绍Golang Timer(定时器),位于Golang 的time包。常用于衡量代码执行效率。

示例

假设一个业务方法需要衡量其执行效率,整个执行时间不能超过60秒,一旦超过发送通知。

实现一

package main

import (
    "time"
    "fmt"
)

const time_in_seconds = 60

func main() {
    // 60 second timer.
    timer := time.NewTimer(time.Second*time_in_seconds)
    defer timer.Stop()
    
    // 等待定时器完成异步任务
    go func() {
        // 阻塞直到定时器完成。时间到了发送消息给通道 timer.C
        // 该协程中没有其他代码执行
        <-timer.C

        // 如果main() 在60秒之前完成,下面代码不会执行
        fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
    }
    
    // 执行一个耗时方法
    executeTheCodeThatMightTakeMoreThanSixtySeconds()
    
    // main()函数完成,所以定时器结束.
}

实现二

对上面示例进行重构,抽取定时器为工具函数:

package main

import (
  "time"
  "fmt"
)

const time_in_seconds = 60

func main() {
  // 设定60秒定时器,时间到了调用发送消息函数
  timer := NewTimer(time_in_seconds, func() {
    fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
  })
  defer timer.Stop()
  
  // 执行一个耗时方法
  executeTheCodeThatMightTakeMoreThanSixtySeconds()
}

// NewTimer创建定时器并运行给定时间,当时间到了调用通知函数
// 最后返回定时器,用于需要时可提前停止定时器
func NewTimer(seconds int, action func()) *time.Timer {
  timer := timer.NewTimer(time.Seconds * time.Duration(seconds))
  
  go func() {
    <-timer.C
    action()
  }
  
  return timer
}

time.AfterFunc

AfterFunc
timer := time.AfterFunc(time.Second*60, func() {
    fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
})
defer timer.Stop()

总结

time.AfterFunc