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