gtimer
是一个并发安全的高性能任务定时器,类似于Java
的Timer
。gtimer
组件旧版本采用的是分层时间轮(Hierarchical Timing Wheel
)设计,从goframe v1.16
版本开始,采用了优先级队列(PriorityQueue
)实现。
使用场景:
任何定时任务场景,大批量定时任务/延迟任务的场景,超时控制/频率控制的业务场景,对于定时时间准确度要求不高的业务场景。
注意事项:
3
分钟才能执行完成,并且计划每隔5
分钟运行一次,那么每次任务之间只有2
分钟的空闲时间。1
秒执行的任务,运行耗时为1
秒,那么在第1秒开始运行后,下一次任务将会在第3秒开始执行。因为中间有一次运行检查时发现有当前任务正在进行,因此退出等待下一次执行检查。使用方式:
import "github.com/gogf/gf/os/gtimer" |
接口文档:
https://godoc.org/github.com/gogf/gf/os/gtimer
简要说明:
New
方法用于创建自定义的任务定时器对象,并可在创建时通过interval
的TimerOptions
参数指定定时器的最小tick
时间间隔。Add
方法用于添加定时任务,其中:interval
参数用于指定方法的执行的时间间隔。job
参数为需要执行的任务方法。AddEntry
方法添加定时任务,支持更多参数的控制。AddSingleton
方法用于添加单例定时任务,即同时只能有一个该任务正在运行。AddOnce
方法用于添加只运行一次的定时任务,当运行一次数后该定时任务自动销毁。AddTimes
方法用于添加运行指定次数的定时任务,当运行times
次数后该定时任务自动销毁。Search
方法用于根据名称进行定时任务搜索(返回定时任务*Entry
对象指针)。Start
方法用于启动定时器(使用New
创建定时器时会自动启动)。Stop
方法用于停止定时器。Close
方法用于关闭定时器。大部分的场景下使用默认的定时器即可。使用gtimer
的默认定时器时,默认的间隔时间为100ms
,因此理论的时间间隔误差范围为0~100ms
。可以使用以下两种方式修改默认的定时器参数:
gf.gtimer.interval=50
: 修改默认的时间刻度为50毫秒
GF_GTIMER_INTERVAL=50
goos: linux goarch: amd64 pkg: github.com/gogf/gf/os/gtimer Benchmark_Add-12 4048776 291.9 ns/op 249 B/op 6 allocs/op Benchmark_StartStop-12 100000000 10.96 ns/op 0 B/op 0 allocs/op PASS ok command-line-arguments 6.602s |
package main import ( "fmt" "github.com/gogf/gf/os/gtimer" "time" ) func main() { now := time.Now() interval := 1400*time.Millisecond gtimer.Add(interval, func() { fmt.Println(time.Now(), time.Duration(time.Now().UnixNano() - now.UnixNano())) now = time.Now() }) select { } } |
执行后,输出结果为:
2019-01-17 18:17:37.022442 +0800 CST m=+1.354132542 1.353568s 2019-01-17 18:17:38.422467 +0800 CST m=+2.754148119 1.399624s 2019-01-17 18:17:39.82318 +0800 CST m=+4.154851847 1.40066s 2019-01-17 18:17:41.222422 +0800 CST m=+5.554084408 1.399094s 2019-01-17 18:17:42.622461 +0800 CST m=+6.954112968 1.399962s 2019-01-17 18:17:44.022769 +0800 CST m=+8.354411089 1.400251s ... |
package main import ( "github.com/gogf/gf/os/glog" "github.com/gogf/gf/os/gtimer" "time" ) func main() { interval := time.Second gtimer.AddSingleton(interval, func() { glog.Println("doing") time.Sleep(5*time.Second) }) select { } } |
执行后,输出结果为:
2019-01-23 17:04:18.892 doing 2019-01-23 17:04:24.890 doing 2019-01-23 17:04:29.892 doing 2019-01-23 17:04:35.891 doing ... |
gtimer
与gcron
区别gtimer
任务定时器与gcron
定时任务模块区别:
gtimer
属于高性能模块,是框架核心模块,构建任何定时任务的基础,任何方法操作耗时均在纳秒
级别。gtimer
可适用于任何的定时任务场景中,例如: TCP通信、游戏开发等场景。gcron
支持经典的crontab
形式的定时任务语法,最小时间设定间隔为秒
。gcron
底层实现基于gtimer
。