package timer import ( "cmp" "sig-pub/pkg/utils/container" "sync" "sync/atomic" "time" ) type timerTask struct { ExecuteAt int64 Canceled atomic.Bool Handler func() } // Timer todo 使用二叉树堆的定时任务执行器 type Timer[T any] struct { mu sync.RWMutex heap *container.Heap[T, int64] tick time.Duration ticker *time.Ticker } func NewTimer[T any, C cmp.Ordered](tick time.Duration, compare func(T) int64) *Timer[T] { return &Timer[T]{ heap: container.NewHeap(compare), tick: tick, } } func (t *Timer[T]) Init() { t.ticker = time.NewTicker(t.tick) go func() { for { now, ok := <-t.ticker.C if !ok { return } t.mu.RLock() v, ok := t.heap.Peek() t.mu.RUnlock() if !ok { continue } _, _ = now, v // todo handler } }() // time.Unix() // t.ticker.C } func (t *Timer[T]) Push(v T, duration time.Duration) { t.heap.Push(v) }