欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Golang 定时器(Timer 和 Ticker),这篇文章就够了

程序员文章站 2022-03-20 18:23:22
定时器是什么golang 原生 time 包下可以用来执行一些定时任务或者是周期性的任务的一个工具本文基于 go 1.14,如果以下文章有哪里不对或者问题的地方,欢迎讨论学习定时器的日常使用timer...

定时器是什么

golang 原生 time 包下可以用来执行一些定时任务或者是周期性的任务的一个工具

本文基于 go 1.14,如果以下文章有哪里不对或者问题的地方,欢迎讨论学习

定时器的日常使用

timer 相关

注意事项:

错误使用:time.after 这里会不断生成 timer,虽然最终会回收,但是会造成无意义的cpu资源消耗 

正确使用:

ticker 相关

错误使用:

定时器源码分析

我先给出涉及到过程的相关结构体(!!!要注意 timer 和 timer 的不同)

我们以 ticker 为切入点

从 newticker 中我们可以看到,开始执行是在 starttimer(),我们进去看下

addtimer

当我们已知 timers 是小顶堆的数据结构(满足“当前位置的值小于等于父位置的值“即可,实现方式使用数组,由下面代码可以知道是四叉小顶堆,结构如下图)的情况后,接下来看堆向上或者向下调整的细节部分

Golang 定时器(Timer 和 Ticker),这篇文章就够了

既然已经知道timer放到四叉小顶堆,那 timer 是怎么执行的呢?接下来就是定时器的核心部分入口 runtimer()

runtimer

因此我们知道了执行的核心流程是 runonetimer()

runonetimer

从 runtimer 的调用,我们知道执行的入口是 checktimers(),我们详细看下

checktimers

我们可以看下图,由下图可知,是通过 go 里面的调度中去寻找可执行的 timer  

Golang 定时器(Timer 和 Ticker),这篇文章就够了

我们看下 checktimers 做了什么

adjusttimers

addadjustedtimers

cleardeletedtimers

大致执行的情况我们看好了,那我们接下来看 stop() 的源码部分

deltimer

后续调度中, timer 的状态可以从 timerdeleted 设置成 timerremoved 并从 timers 堆中去除(注意,这里用了“可以”,可以看上面的状态图了解)

在复用 timer 的时候,我们经常使用 reset(),我们来看下源码部分是怎么样的

modtimer

 到此这篇关于golang 定时器(timer 和 ticker),这篇文章就够了的文章就介绍到这了,更多相关golang 定时器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关标签: Golang 定时器