go超級時間輪timewheel(一路向前)github.com/anjieych/timewheel

Anjie發表於2017-12-12

go超級時間輪timewheel(一路向前)github.com/anjieych/timewheel

有傳統時間輪的影子,但又超出傳統時間輪:

  1. 非“盤/環”形結構: 一路向前,永不回頭,每tick一次,移除一個slot;每個slot中的entity 觸發OnExpired來處理到期(或過期)事件;
  2. 超級時間輪: 他是一個輪或者輪的集合,因為他可以同時處理不同實現了Entity的業務,每個業務有各自OnExpired定義,只要可以遵循相同的時間刻度Interval就可以放入同一個輪來統一計時觸發。 最後,優點或缺點可以作者交流。

[========]

package main

import (
    "fmt"
    "github.com/anjieych/timewheel"
    "time"
)

func main() {
    tw := timewheel.NewTimewheel("tw-example", time.Second)
    tw.Start()
    tick := time.NewTicker(3 * time.Second)
    for {
        d := &Data{
            eid:  time.Now().UnixNano(),
            data: <-tick.C,
        }
        d.SetSlotId(tw.Add(d, 5*time.Second))
    }
}
// Data must implements timewheel.Entity
type Data struct {
    eid    int64
    slotId int
    data   interface{}
}

func (d *Data) SetEId(eId int64) {
    d.eid = eId
}
func (d *Data) GetEId() (eId int64) {
    return d.eid
}
func (d *Data) SetSlotId(slotId int) {
    d.slotId = slotId
}
func (d *Data) GetSlotId() (slotId int) {
    return d.slotId
}
func (d *Data) OnExpired() {
    fmt.Printf("%s\t OnExpired :{slotId: %d\t,eid: %d\t,data: %s}\n", time.Now(), d.GetSlotId(), d.GetEId(), d.data)
}

相關文章