没有合适的资源?快使用搜索试试~ 我知道了~
一个系统中存在着大量的调度任务,同时调度任务存在时间的滞后性,而大量的调度任务如果每一个都使用自己的调度器来管理任务的生命周期的话,浪费cpu的资源而且很低效。 本文来介绍 go-zero 中 延迟操作,它可能让开发者调度多个任务时,只需关注具体的业务执行函数和执行时间「立即或者延迟」。而 延迟操作,通常可以采用两个方案: Timer:定时器维护一个优先队列,到时间点执行,然后把需要执行的 task 存储在 map 中collection 中的 timingWheel ,维护一个存放任务组的数组,每一个槽都维护一个存储task的双向链表。开始执行时,计时器每隔指定时间执行一个槽里面的tasks
资源推荐
资源详情
资源评论


























go-zero 应对海量定时应对海量定时/延迟任务的技巧延迟任务的技巧
一个系统中存在着大量的调度任务,同时调度任务存在时间的滞后性,而大量的调度任务如果每一个都使用自己的调度器来管理任务的生命周期的话,浪费cpu的资源而
且很低效。
本文来介绍 go-zero 中 延迟操作,它可能让开发者调度多个任务时,只需关注具体的业务执行函数和执行时间「立即或者延迟」。而 延迟操作,通常可以采用两个方案:
Timer:定时器维护一个优先队列,到时间点执行,然后把需要执行的 task 存储在 map 中collection 中的 timingWheel ,维护一个存放任务组的数组,每一个槽都维护一个存储
task的双向链表。开始执行时,计时器每隔指定时间执行一个槽里面的tasks。
方案2把维护task从 优先队列 O(nlog(n)) 降到 双向链表 O(1),而执行task也只要轮询一个时间点的tasks O(N),不需要像优先队列,放入和删除元素 O(nlog(n))。
我们先看看 go-zero 中自己对 timingWheel 的使用 :
cache 中的 timingWheel
首先我们先来在 collection 的 cache 中关于 timingWheel 的使用:
timingWheel, err := NewTimingWheel(time.Second, slots, func(k, v interface{}) {
key, ok := k.(string)
if !ok {
return
}
cache.Del(key)
})
if err != nil {
return nil, err
}
cache.timingWheel = timingWheel
这是 cache 初始化中也同时初始化 timingWheel 做key的过期处理,参数依次代表:
interval:时间划分刻度
numSlots:时间槽
execute:时间点执行函数
在 cache 中执行函数则是 删除过期key,而这个过期则由 timingWheel 来控制推进时间。
接下来,就通过 cache 对 timingWheel 的使用来认识。
初始化初始化
// 真正做初始化
func newTimingWheelWithClock(interval time.Duration, numSlots int, execute Execute, ticker timex.Ticker) (
*TimingWheel, error) {
tw := &TimingWheel{
interval: interval, // 单个时间格时间间隔
ticker: ticker, // 定时器,做时间推动,以interval为单位推进
slots: make([]*list.List, numSlots), // 时间轮
timers: NewSafeMap(), // 存储task{key, value}的map [执行execute所需要的参数] tickedPos: numSlots - 1, // at previous virtual circle
execute: execute, // 执行函数
numSlots: numSlots, // 初始化 slots num
setChannel: make(chan timingEntry), // 以下几个channel是做task传递的
moveChannel: make(chan baseEntry),
removeChannel: make(chan interface{}),
drainChannel: make(chan func(key, value interface{})),
stopChannel: make(chan lang.PlaceholderType),
}
// 把 slot 中存储的 list 全部准备好
tw.initSlots()
// 开启异步协程,使用 channel 来做task通信和传递
go tw.run()
return tw, nil
}
以上比较直观展示 timingWheel 的 “时间轮”,后面会围绕这张图解释其中推进的细节。
资源评论


weixin_38625559
- 粉丝: 2
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 单片机课程设计方案报告电子时钟.doc
- 通信信号覆盖用电信息采集终端解决方案.docx
- 浅析网络犯罪及相关问题.docx
- 程序设计类参赛作品设计与制作.ppt
- 广告英语的语言特点jsp.doc
- 大学方案(设计方案)单片机控制快热式家用电热水器方案.doc
- lilishop 商城 java商城-C语言资源
- 淘福啦凯达分享:计算机测验考试网络工程师复习总结.doc
- 运用大数据开展监督执纪的探索.docx
- C语言-第14章.ppt
- 基于信息化环境的家电制造企业财务管理创新探索.docx
- 基于单片机十字路口交通灯课程方案设计书终稿-.doc
- 网络发展不可漠视的三大异象.docx
- ta环保复合型净水剂硫酸铝生产项目管理.doc
- 如何提高项目管理中的执行力.docx
- 江苏省年度职称计算机试题.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
