gf/g/os/gwheel/gwheel.go

78 lines
2.6 KiB
Go
Raw Normal View History

2018-12-30 11:08:07 +08:00
// Copyright 2019 gf Author(https://gitee.com/johng/gf). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://gitee.com/johng/gf.
2019-01-01 19:43:31 +08:00
// Package gwheel provides Timing Wheel for interval jobs running and management/时间轮.
2019-01-06 11:09:50 +08:00
// 高效的时间轮任务管理模块,用于管理间隔/延迟运行任务。
// 与gcron模块的区别是时间轮模块只管理间隔执行任务并且更注重执行效率(纳秒级别)。
2019-01-09 12:54:37 +08:00
// 需要注意执行时间间隔的准确性问题: https://github.com/golang/go/issues/14410
2019-01-01 19:43:31 +08:00
package gwheel
2019-01-09 12:54:37 +08:00
import (
"math"
"time"
)
2018-12-30 11:08:07 +08:00
const (
2019-01-03 19:11:54 +08:00
STATUS_READY = 0
STATUS_RUNNING = 1
STATUS_CLOSED = -1
gPANIC_EXIT = "exit"
2019-01-11 13:46:40 +08:00
gDEFAULT_TIMES = math.MaxInt32
2019-01-06 11:09:50 +08:00
gDEFAULT_SLOT_NUMBER = 10
2019-01-12 20:20:30 +08:00
gDEFAULT_WHEEL_INTERVAL = 30*time.Millisecond
gDEFAULT_WHEEL_LEVEL = 5
2018-12-30 11:08:07 +08:00
)
var (
2018-12-30 14:53:16 +08:00
// 默认的wheel管理对象
2019-01-11 13:46:40 +08:00
defaultWheels = New(gDEFAULT_SLOT_NUMBER, gDEFAULT_WHEEL_INTERVAL, gDEFAULT_WHEEL_LEVEL)
2018-12-30 11:08:07 +08:00
)
// 添加执行方法,可以给定名字,以便于后续执行删除
2019-01-09 13:26:59 +08:00
func Add(interval time.Duration, job JobFunc) *Entry {
2019-01-11 13:46:40 +08:00
return defaultWheels.Add(interval, job)
2018-12-30 11:08:07 +08:00
}
// 添加单例运行循环任务
2019-01-09 13:26:59 +08:00
func AddSingleton(interval time.Duration, job JobFunc) *Entry {
2019-01-11 13:46:40 +08:00
return defaultWheels.AddSingleton(interval, job)
2018-12-30 11:08:07 +08:00
}
// 添加只运行一次的循环任务
2019-01-09 13:26:59 +08:00
func AddOnce(interval time.Duration, job JobFunc) *Entry {
2019-01-11 13:46:40 +08:00
return defaultWheels.AddOnce(interval, job)
2019-01-01 19:43:31 +08:00
}
// 添加运行指定次数的循环任务
2019-01-09 13:26:59 +08:00
func AddTimes(interval time.Duration, times int, job JobFunc) *Entry {
2019-01-11 13:46:40 +08:00
return defaultWheels.AddTimes(interval, times, job)
2018-12-30 11:08:07 +08:00
}
// 延迟添加循环任务delay参数单位为秒
2019-01-03 19:11:54 +08:00
func DelayAdd(delay time.Duration, interval time.Duration, job JobFunc) {
2019-01-11 13:46:40 +08:00
defaultWheels.DelayAdd(delay, interval, job)
2018-12-30 11:08:07 +08:00
}
// 延迟添加单例循环任务delay参数单位为秒
2019-01-03 19:11:54 +08:00
func DelayAddSingleton(delay time.Duration, interval time.Duration, job JobFunc) {
2019-01-11 13:46:40 +08:00
defaultWheels.DelayAddSingleton(delay, interval, job)
2018-12-30 11:08:07 +08:00
}
// 延迟添加只运行一次的循环任务delay参数单位为秒
2019-01-03 19:11:54 +08:00
func DelayAddOnce(delay time.Duration, interval time.Duration, job JobFunc) {
2019-01-11 13:46:40 +08:00
defaultWheels.DelayAddOnce(delay, interval, job)
2019-01-01 19:43:31 +08:00
}
// 延迟添加运行指定次数的循环任务delay参数单位为秒
2019-01-03 19:11:54 +08:00
func DelayAddTimes(delay time.Duration, interval time.Duration, times int, job JobFunc) {
2019-01-11 13:46:40 +08:00
defaultWheels.DelayAddTimes(delay, interval, times, job)
}
2019-01-02 10:18:00 +08:00
// 在Job方法中调用停止当前运行的任务
func Exit() {
2018-12-30 14:53:16 +08:00
panic(gPANIC_EXIT)
}