网站首页 > 文章中心 > 其它

go语言定时器失效

作者:小编 更新时间:2023-09-06 17:46:13 浏览量:495人看过

Golang-基于TimeingWheel定时器

在linux下实现定时器主要有如下方式

go语言定时器失效-图1

在这当中 基于时间轮方式实现的定时器 时间复杂度最小,效率最高,然而我们可以通过 优先队列 实现时间轮定时器.

优先队列的实现可以使用最大堆和最小堆,所以呢在队列中所有的数据都可以定义排序规则自动排序.我们直接通过队列中 pop 函数获取数据,就是我们按照自定义排序规则想要的数据.

在 Golang 中实现一个优先队列异常简单,在 container/head 包中已经帮我们封装了,实现的细节,我们只需要实现特定的接口就可以.

下面是官方提供的例子

因为优先队列底层数据结构是由二叉树构建的,所以我们可以通过数组来保存二叉树上的每一个节点.

改数组需要实现 Go 预先定义的接口 Len , Less , Swap , Push , Pop 和 update .

timerType结构是定时任务抽象结构

首先的 start 函数,当创建一个 TimeingWheel 时,通过一个 goroutine 来执行 start ,在start中for循环和select来监控不同的channel的状态

通过for循环从队列中取数据,直到该队列为空或者是遇见第一个当前时间比任务开始时间大的任务, append 到 expired 中.因为优先队列中是根据 expiration 来排序的,

所以当取到第一个定时任务未到的任务时,表示该定时任务以后的任务都未到时间.

go语言定时器失效-图2

当 getExpired 函数取出队列中要执行的任务时,当有的定时任务需要不断执行,所以就需要判断是否该定时任务需要重新放回优先队列中. isRepeat 是通过判断任务中 interval 是否大于 0 判断,

如果大于0 则,表示永久就生效.

防止外部滥用,阻塞定时器协程,框架又一次封装了timer这个包,名为 timer_wapper 这个包,它提供了两种调用方式.

参数和上面的参数一样,只是在第三个参数中使用了任务池,将定时任务放入了任务池中.定时任务的本身执行就是一个 put 操作.

至于put以后,那就是 workers 这个包管理的了.在 worker 包中, 也就是维护了一个任务池,任务池中的任务会有序的执行,方便管理.

go语言new一个变量后怎么释放

go语言和java类似

不需要人为的释放内存

当所有的引用都失效后

系统会自动回收内存的.

golang 定时器,启动的时候执行一次,以后每天晚上12点执行,怎么实现

func?startTimer(f?func())?{

go?func()?{

for?{

f()

now?:=?time.Now()

//?计算下一个零点

go语言定时器失效-图3

next?=?time.Date(next.Year(),?next.Month(),?next.Day(),?0,?0,?0,?0,?next.Location())

t?:=?time.NewTimer(next.Sub(now))

-t.C

}

}()

以上就是土嘎嘎小编为大家整理的go语言定时器失效相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章