github.com/zhongdalu/gf@v1.0.0/g/os/gtimer/gtimer.go (about)

     1  // Copyright 2019 gf Author(https://github.com/zhongdalu/gf). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/zhongdalu/gf.
     6  
     7  // Package gtimer implements Hierarchical Timing Wheel for interval/delayed jobs running and management.
     8  //
     9  // 任务定时器,
    10  // 高性能的分层时间轮任务管理模块,用于管理间隔/延迟运行任务。
    11  // 与gcron模块的区别是,时间轮模块只管理间隔执行任务,并且更注重执行效率(纳秒级别)。
    12  // 需要注意执行时间间隔的准确性问题: https://github.com/golang/go/issues/14410
    13  package gtimer
    14  
    15  import (
    16  	"github.com/zhongdalu/gf/g/internal/cmdenv"
    17  	"math"
    18  	"time"
    19  )
    20  
    21  const (
    22  	STATUS_READY            = 0
    23  	STATUS_RUNNING          = 1
    24  	STATUS_STOPPED          = 2
    25  	STATUS_CLOSED           = -1
    26  	gPANIC_EXIT             = "exit"
    27  	gDEFAULT_TIMES          = math.MaxInt32
    28  	gDEFAULT_SLOT_NUMBER    = 10
    29  	gDEFAULT_WHEEL_INTERVAL = 50
    30  	gDEFAULT_WHEEL_LEVEL    = 6
    31  )
    32  
    33  var (
    34  	// 默认定时器属性参数值
    35  	defaultSlots    = cmdenv.Get("gf.gtimer.slots", gDEFAULT_SLOT_NUMBER).Int()
    36  	defaultLevel    = cmdenv.Get("gf.gtimer.level", gDEFAULT_WHEEL_LEVEL).Int()
    37  	defaultInterval = cmdenv.Get("gf.gtimer.interval", gDEFAULT_WHEEL_INTERVAL).Duration() * time.Millisecond
    38  	// 默认的wheel管理对象
    39  	defaultTimer = New(defaultSlots, defaultInterval, defaultLevel)
    40  )
    41  
    42  // 类似与js中的SetTimeout,一段时间后执行回调函数。
    43  func SetTimeout(delay time.Duration, job JobFunc) {
    44  	AddOnce(delay, job)
    45  }
    46  
    47  // 类似与js中的SetInterval,每隔一段时间执行指定回调函数。
    48  func SetInterval(interval time.Duration, job JobFunc) {
    49  	Add(interval, job)
    50  }
    51  
    52  // 添加执行方法。
    53  func Add(interval time.Duration, job JobFunc) *Entry {
    54  	return defaultTimer.Add(interval, job)
    55  }
    56  
    57  // 添加执行方法,更多参数控制。
    58  func AddEntry(interval time.Duration, job JobFunc, singleton bool, times int, status int) *Entry {
    59  	return defaultTimer.AddEntry(interval, job, singleton, times, status)
    60  }
    61  
    62  // 添加单例运行循环任务。
    63  func AddSingleton(interval time.Duration, job JobFunc) *Entry {
    64  	return defaultTimer.AddSingleton(interval, job)
    65  }
    66  
    67  // 添加只运行一次的循环任务。
    68  func AddOnce(interval time.Duration, job JobFunc) *Entry {
    69  	return defaultTimer.AddOnce(interval, job)
    70  }
    71  
    72  // 添加运行指定次数的循环任务。
    73  func AddTimes(interval time.Duration, times int, job JobFunc) *Entry {
    74  	return defaultTimer.AddTimes(interval, times, job)
    75  }
    76  
    77  // 延迟添加循环任务。
    78  func DelayAdd(delay time.Duration, interval time.Duration, job JobFunc) {
    79  	defaultTimer.DelayAdd(delay, interval, job)
    80  }
    81  
    82  // 延迟添加循环任务, 支持完整的参数。
    83  func DelayAddEntry(delay time.Duration, interval time.Duration, job JobFunc, singleton bool, times int, status int) {
    84  	defaultTimer.DelayAddEntry(delay, interval, job, singleton, times, status)
    85  }
    86  
    87  // 延迟添加单例循环任务,delay参数单位为秒
    88  func DelayAddSingleton(delay time.Duration, interval time.Duration, job JobFunc) {
    89  	defaultTimer.DelayAddSingleton(delay, interval, job)
    90  }
    91  
    92  // 延迟添加只运行一次的循环任务,delay参数单位为秒
    93  func DelayAddOnce(delay time.Duration, interval time.Duration, job JobFunc) {
    94  	defaultTimer.DelayAddOnce(delay, interval, job)
    95  }
    96  
    97  // 延迟添加运行指定次数的循环任务,delay参数单位为秒
    98  func DelayAddTimes(delay time.Duration, interval time.Duration, times int, job JobFunc) {
    99  	defaultTimer.DelayAddTimes(delay, interval, times, job)
   100  }
   101  
   102  // 在Job方法中调用,停止并删除当前运行的任务。
   103  func Exit() {
   104  	panic(gPANIC_EXIT)
   105  }