Go每日一库之121:timer(时间轮算法定时器)
当业务要处理大量的定时任务时,如果每个任务都创建一个Golang原生的timer的话,会占用较多的cpu资源,这类场景,可以用时间轮算法优化timer的资源消耗。本次介绍一款多级时间轮库antlabs/timer(以下timer特指antlabs/timer库),处理类似场景的优化。
功能介绍
timer最小的时间粒度是10ms, antlabs/timer支持以下功能:
- 一次性定时,类似time.AfterFunc;
- 周期性执行,类似time.Ticker;
- 取消单个任务;
- 停止所有任务。
使用指南
安装
go get github.com/antlabs/timer
代码示例
下面是一个简单的例子:
package main
import (
"log"
"time"
"github.com/antlabs/timer"
)
func main() {
tm := timer.NewTimer()
// 一次性执行,2s后执行
tm.AfterFunc(2*time.Second, func() {
log.Printf("2 time.Second")
})
// tk3 会被 tk3.Stop()函数调用取消掉
tk3 := tm.AfterFunc(3*time.Second, func() {
log.Printf("3 time.Second")
})
tk3.Stop() //取消tk3
// 周期执行,每1s执行一次
tm.ScheduleFunc(1*time.Second, func() {
log.Printf("schedule\n")
})
tm.Run()
}
timer使用起来是比较简单的,根据业务场景选择合适的接口就好。
benchmark
Golang 1.14对定时器做了优化,每个P维护一个定时器,减少了添加删除任务时的锁竞争,但是和本文介绍的timer库对比起来还是有些耗资源,下面是benchmark的结果:
Golang 版本:1.16.6
cpu: Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz
Benchmark_antlabs_Timer_AddTimer
Benchmark_antlabs_Timer_AddTimer/N-1m
Benchmark_antlabs_Timer_AddTimer/N-1m-8 9226951 116.6 ns/op 80 B/op 1 allocs/op
Benchmark_antlabs_Timer_AddTimer/N-5m
Benchmark_antlabs_Timer_AddTimer/N-5m-8 9589074 153.9 ns/op 80 B/op 1 allocs/op
Benchmark_antlabs_Timer_AddTimer/N-10m
Benchmark_antlabs_Timer_AddTimer/N-10m-8 9621186 167.0 ns/op 80 B/op 1 allocs/op
Benchmark_Stdlib_AddTimer
Benchmark_Stdlib_AddTimer/N-1m
Benchmark_Stdlib_AddTimer/N-1m-8 4967716 220.0 ns/op 81 B/op 1 allocs/op
Benchmark_Stdlib_AddTimer/N-5m
Benchmark_Stdlib_AddTimer/N-5m-8 5265825 237.9 ns/op 80 B/op 1 allocs/op
Benchmark_Stdlib_AddTimer/N-10m
Benchmark_Stdlib_AddTimer/N-10m-8 7703940 230.8 ns/op 80 B/op 1 allocs/op
总结
timer利用时间轮算法,通过降低定时器精度的方式,将同一个时间单位内的任务集中存储到一个双向链表,可以一次锁操作处理,减少锁竞争,进而提高性能,对于业务中有大量定时任务,同时对精度要求大于10ms的场景,可以尝试timer库来优化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人