前言
前面我们介绍了一次性定时器Timer和周期性定时器Ticker,这两种定时器内部实现机制相同。创建定时器的协程并不负责计时,而是把任务交给系统协程,系统协程统一处理所有的定时器。
本节,我们重点关注系统协程是如何管理这些定器的,包括以下问题:
定时器使用什么数据结构存储?
定时器如何触发事件?
定时器如何添加进系统协程?
定时器如何从系统协程中删除?
定时器存储
timer数据结构
Timer和Ticker数据结构除名字外完全一样,二者都含有一个runtimeTimer类型的成员,这个就是系统协程所维护的对象。 runtimeTimer类型是time包的名称,在runtime包中,这个类型叫做timer。
timer数据结构如下所示:
type timer struct {
tb *timersBucket // the bucket the timer lives in // 当前定时器寄存于系统timer堆的地址
i int // heap index // 当前定时器寄存于系统timer堆的下标
when int64 // 当前定时器下次触发时间
period int64 // 当前定时器周期触发间隔(如果是Timer,间隔为0,表示不重复触发)
f func(interface{}, uintptr) // 定时器触发时执行的函数
arg interface{} // 定时器触发时执行函数传递的参数一
seq uintptr // 定时器触发时执行函数传递的参数二(该参数只在网络收发场景下使用)
}
其中timersBucket便是系统协程存储timer的地方,而i便是timer存储的下标。
timersBucket数据结构
存储拓扑
(图示,timer和timersBucket的关系)
本文深入探讨了系统协程如何管理一次性定时器Timer和周期性定时器Ticker,详细介绍了它们的数据结构存储方式、触发机制及如何添加和删除定时器。

1049

被折叠的 条评论
为什么被折叠?



