This commit is contained in:
John
2019-01-09 13:26:59 +08:00
parent 292fd2f39e
commit e373392f64
4 changed files with 24 additions and 27 deletions

View File

@ -31,22 +31,22 @@ var (
)
// 添加执行方法,可以给定名字,以便于后续执行删除
func Add(interval time.Duration, job JobFunc) (*Entry, error) {
func Add(interval time.Duration, job JobFunc) *Entry {
return defaultWheel.Add(interval, job)
}
// 添加单例运行循环任务
func AddSingleton(interval time.Duration, job JobFunc) (*Entry, error) {
func AddSingleton(interval time.Duration, job JobFunc) *Entry {
return defaultWheel.AddSingleton(interval, job)
}
// 添加只运行一次的循环任务
func AddOnce(interval time.Duration, job JobFunc) (*Entry, error) {
func AddOnce(interval time.Duration, job JobFunc) *Entry {
return defaultWheel.AddOnce(interval, job)
}
// 添加运行指定次数的循环任务
func AddTimes(interval time.Duration, times int, job JobFunc) (*Entry, error) {
func AddTimes(interval time.Duration, times int, job JobFunc) *Entry {
return defaultWheel.AddTimes(interval, times, job)
}

View File

@ -7,8 +7,6 @@
package gwheel
import (
"errors"
"fmt"
"gitee.com/johng/gf/g/container/gtype"
"time"
)
@ -27,13 +25,15 @@ type Entry struct {
type JobFunc func()
// 创建循环任务
func (w *Wheel) newEntry(interval time.Duration, job JobFunc, singleton bool, times int) (*Entry, error) {
func (w *Wheel) newEntry(interval time.Duration, job JobFunc, singleton bool, times int) *Entry {
// 安装任务的间隔时间(纳秒)
n := interval.Nanoseconds()
// 计算出所需的插槽数量
num := int(n/w.interval)
if num == 0 {
return nil, errors.New(fmt.Sprintf(`interval "%v" should not be less than timing wheel interval "%v"`, interval, time.Duration(w.interval)))
// 如果添加的任务间隔时间比时间轮的刻度还小,
// 那么默认为1个刻度
num = 1
}
ticks := w.ticks.Val()
entry := &Entry {
@ -49,7 +49,7 @@ func (w *Wheel) newEntry(interval time.Duration, job JobFunc, singleton bool, ti
for i := 0; i < w.number; i += num {
w.slots[(i + index + num) % w.number].PushBack(entry)
}
return entry, nil
return entry
}
// 获取任务状态

View File

@ -45,47 +45,47 @@ func New(slot int, interval time.Duration) *Wheel {
}
// 添加循环任务
func (w *Wheel) Add(interval time.Duration, job JobFunc) (*Entry, error) {
func (w *Wheel) Add(interval time.Duration, job JobFunc) *Entry {
return w.newEntry(interval, job, false, gDEFAULT_TIMES)
}
// 添加单例运行循环任务
func (w *Wheel) AddSingleton(interval time.Duration, job JobFunc) (*Entry, error) {
func (w *Wheel) AddSingleton(interval time.Duration, job JobFunc) *Entry {
return w.newEntry(interval, job, true, gDEFAULT_TIMES)
}
// 添加只运行一次的循环任务
func (w *Wheel) AddOnce(interval time.Duration, job JobFunc) (*Entry, error) {
func (w *Wheel) AddOnce(interval time.Duration, job JobFunc) *Entry {
return w.newEntry(interval, job, false, 1)
}
// 添加运行指定次数的循环任务
func (w *Wheel) AddTimes(interval time.Duration, times int, job JobFunc) (*Entry, error) {
func (w *Wheel) AddTimes(interval time.Duration, times int, job JobFunc) *Entry {
return w.newEntry(interval, job, false, times)
}
// 延迟添加循环任务delay参数单位为时间轮刻度
// 延迟添加循环任务
func (w *Wheel) DelayAdd(delay time.Duration, interval time.Duration, job JobFunc) {
w.AddOnce(delay, func() {
w.Add(interval, job)
})
}
// 延迟添加单例循环任务delay参数单位为时间轮刻度
// 延迟添加单例循环任务
func (w *Wheel) DelayAddSingleton(delay time.Duration, interval time.Duration, job JobFunc) {
w.AddOnce(delay, func() {
w.AddSingleton(interval, job)
})
}
// 延迟添加只运行一次的循环任务delay参数单位为时间轮刻度
// 延迟添加只运行一次的循环任务
func (w *Wheel) DelayAddOnce(delay time.Duration, interval time.Duration, job JobFunc) {
w.AddOnce(delay, func() {
w.AddOnce(interval, job)
})
}
// 延迟添加只运行一次的循环任务delay参数单位为时间轮刻度
// 延迟添加只运行一次的循环任务
func (w *Wheel) DelayAddTimes(delay time.Duration, interval time.Duration, times int, job JobFunc) {
w.AddOnce(delay, func() {
w.AddTimes(interval, times, job)

View File

@ -17,12 +17,11 @@ import (
)
func TestWheel_Entry_Operation(t *testing.T) {
wheel := gwheel.NewDefault()
array := garray.New(0, 0)
entry, err := wheel.Add(time.Second, func() {
wheel := gwheel.NewDefault()
array := garray.New(0, 0)
entry := wheel.Add(time.Second, func() {
array.Append(1)
})
gtest.Assert(err, nil)
time.Sleep(1200*time.Millisecond)
gtest.Assert(array.Len(), 1)
entry.Close()
@ -33,12 +32,11 @@ func TestWheel_Entry_Operation(t *testing.T) {
func TestWheel_Entry_Singleton(t *testing.T) {
wheel := gwheel.NewDefault()
array := garray.New(0, 0)
entry, err := wheel.Add(time.Second, func() {
entry := wheel.Add(time.Second, func() {
array.Append(1)
time.Sleep(10*time.Second)
})
entry.SetSingleton(true)
gtest.Assert(err, nil)
time.Sleep(1200*time.Millisecond)
gtest.Assert(array.Len(), 1)
@ -47,13 +45,12 @@ func TestWheel_Entry_Singleton(t *testing.T) {
}
func TestWheel_Entry_Once(t *testing.T) {
wheel := gwheel.NewDefault()
array := garray.New(0, 0)
entry, err := wheel.Add(time.Second, func() {
wheel := gwheel.NewDefault()
array := garray.New(0, 0)
entry := wheel.Add(time.Second, func() {
array.Append(1)
})
entry.SetTimes(1)
gtest.Assert(err, nil)
time.Sleep(1200*time.Millisecond)
gtest.Assert(array.Len(), 1)
}