timingwheel icon indicating copy to clipboard operation
timingwheel copied to clipboard

请教一下, 为什么是用链表?

Open yangliyl opened this issue 3 years ago • 2 comments

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到期时间都是一样的, 那直接用数组不行吗? 请大佬解惑

yangliyl avatar May 26 '21 12:05 yangliyl

数组是确定大小的,并且添加和删除都需要自己维护索引,操作比较复杂,list数据结构就比较简单了。

tobyzxj avatar Oct 06 '21 03:10 tobyzxj

感谢 @tobyzxj 帮忙回复!

添加task的时候直接追加的数组尾部, 到期时直接遍历数组取出所有task.

我稍微补充一下:

  1. 数组扩容时会 copy 数据,不如链表高效
  2. timer.Stop() 可能会从任意位置删除元素,链表最适合这种操作

RussellLuo avatar Feb 18 '22 14:02 RussellLuo