mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
up
This commit is contained in:
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
// 获取任务状态
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user