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 }