图解分布式定时器从零实现 | go语言
warning:
这篇文章距离上次修改已过200天,其中的内容可能已经有所变动。
package main
import (
"fmt"
"time"
)
// Timer 表示一个定时器,用于在将来的某个时间点触发一个事件。
type Timer struct {
expireTime time.Time // 定时器触发的时间
callback func() // 定时器触发时调用的函数
}
// NewTimer 创建一个新的定时器,在duration后触发callback。
func NewTimer(duration time.Duration, callback func()) *Timer {
return &Timer{
expireTime: time.Now().Add(duration),
callback: callback,
}
}
// ExpireTime 返回定时器触发的时间。
func (t *Timer) ExpireTime() time.Time {
return t.expireTime
}
// Tick 模拟time.Tick的行为,每隔duration时间触发一次callback。
func Tick(duration time.Duration, callback func()) {
for {
time.Sleep(duration)
callback()
}
}
func main() {
// 示例:使用定时器在1秒后打印一条消息
timer := NewTimer(time.Second, func() {
fmt.Println("Timer expired!")
})
// 模拟定时器行为
for {
if time.Now().After(timer.ExpireTime()) {
timer.callback()
break // 定时器触发后退出循环
}
time.Sleep(50 * time.Millisecond) // 模拟定时器精度
}
// 示例:使用Tick每2秒钟打印一条消息
go Tick(2*time.Second, func() {
fmt.Println("Tick...")
})
// 主goroutine休眠,保证程序不立即退出
time.Sleep(10 * time.Second)
}
这段代码定义了一个Timer
结构体,用于表示一个定时器,并实现了创建定时器、获取定时器触发时间和模拟time.Tick
行为的功能。在main
函数中,我们创建了一个定时器,并模拟定时器行为,在定时器触发后打印一条消息。同时,我们还使用Tick
函数每隔2秒钟打印另一条消息。这个例子展示了如何使用Go语言实现一个简单的定时器模型。
评论已关闭