diff --git a/g/os/gwheel/gwheel.go b/g/os/gwheel/gwheel.go index 2cf6eebc1..72b2d5b9b 100644 --- a/g/os/gwheel/gwheel.go +++ b/g/os/gwheel/gwheel.go @@ -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) } diff --git a/g/os/gwheel/gwheel_entry.go b/g/os/gwheel/gwheel_entry.go index 5f5cde699..fbd5d2038 100644 --- a/g/os/gwheel/gwheel_entry.go +++ b/g/os/gwheel/gwheel_entry.go @@ -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 } // 获取任务状态 diff --git a/g/os/gwheel/gwheel_wheel.go b/g/os/gwheel/gwheel_wheel.go index 3ee1e30dc..2bd2347f0 100644 --- a/g/os/gwheel/gwheel_wheel.go +++ b/g/os/gwheel/gwheel_wheel.go @@ -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) diff --git a/g/os/gwheel/gwheel_z_unit_2_test.go b/g/os/gwheel/gwheel_z_unit_2_test.go index 2aa67a6a6..997d52159 100644 --- a/g/os/gwheel/gwheel_z_unit_2_test.go +++ b/g/os/gwheel/gwheel_z_unit_2_test.go @@ -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) }