Skip to main content
 首页 » 编程设计

介绍 Golang Timer(定时器)

2022年07月19日136mengfanrong

介绍 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

起始time已经提供了工具函数AfterFunc,完全能够实现前节功能:

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

总结

本文介绍了Time定时器,结合示例说明time.AfterFunc工具函数的应用场景。同时也涉及了协程、通道等Golang最酷的特性。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/107426076
阅读延展