timingwheel
timingwheel copied to clipboard
请教一下, 为什么是用链表?
func (b *bucket) Flush(reinsert func(*Timer)) {
var ts []*Timer
b.mu.Lock()
for e := b.timers.Front(); e != nil; {
next := e.Next()
t := e.Value.(*Timer)
b.remove(t)
ts = append(ts, t)
e = next
}
b.mu.Unlock()
b.SetExpiration(-1) // TODO: Improve the coordination with b.Add()
for _, t := range ts {
reinsert(t)
}
}
bucket为什么是用链表呢? 没有体会到它的作用. 添加task的时候直接追加的数组尾部, 到期时直接遍历数组取出所有task. 因为每个bucket里的task到期时间都是一样的, 那直接用数组不行吗? 请大佬解惑
数组是确定大小的,并且添加和删除都需要自己维护索引,操作比较复杂,list数据结构就比较简单了。
感谢 @tobyzxj 帮忙回复!
添加task的时候直接追加的数组尾部, 到期时直接遍历数组取出所有task.
我稍微补充一下:
- 数组扩容时会 copy 数据,不如链表高效
- timer.Stop() 可能会从任意位置删除元素,链表最适合这种操作