教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go语言-time.Ticker(定时任务实现)

go语言-time.Ticker(定时任务实现)

发布时间:2022-03-25   编辑:jiaochengji.com
教程集为您提供go语言-time.Ticker(定时任务实现)等资源,欢迎您收藏本站,我们将为您提供最新的go语言-time.Ticker(定时任务实现)资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h2>Go语言 之time.Ticker</h2>

Go语言 之time.Ticke
参考URL: Code.dev.xdja.com/diffusion/
Golang time.Timer and time.Ticker
参考URL: https://www.jianshu.com/p/2b4686b8de4a

time.Timer
首先我们看Timer的结构定义:

<pre><code class="lang-go hljs"><span class="token keyword">type</span> Timer <span class="token keyword">struct</span> <span class="token punctuation">{</span> C <span class="token operator"><-</span><span class="token keyword">chan</span> Time r runtimeTimer <span class="token punctuation">}</span> </code></pre>

其中有一个C的只读channel,还有一个runtimeTimer类型的结构体,再看一下这个结构的具体结构:

<pre><code class="lang-go hljs"><span class="token keyword">type</span> runtimeTimer <span class="token keyword">struct</span> <span class="token punctuation">{</span> tb <span class="token builtin">uintptr</span> i <span class="token builtin">int</span> when <span class="token builtin">int64</span> period <span class="token builtin">int64</span> f <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token builtin">uintptr</span><span class="token punctuation">)</span> <span class="token comment">// NOTE: must not be closure</span> arg <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span> seq <span class="token builtin">uintptr</span> <span class="token punctuation">}</span> </code></pre>

在使用定时timer的时候都是通过 NewTimer 或 AfterFunc 函数来获取。

<pre><code class="lang-go hljs"><span class="token keyword">func</span> <span class="token function">NewTimer</span><span class="token punctuation">(</span>d Duration<span class="token punctuation">)</span> <span class="token operator">*</span>Timer <span class="token punctuation">{</span> c <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">chan</span> Time<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> t <span class="token operator">:=</span> <span class="token operator">&</span>Timer<span class="token punctuation">{</span> C<span class="token punctuation">:</span> c<span class="token punctuation">,</span> r<span class="token punctuation">:</span> runtimeTimer<span class="token punctuation">{</span> when<span class="token punctuation">:</span> <span class="token function">when</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token comment">//表示达到时间段d时候调用f</span> f<span class="token punctuation">:</span> sendTime<span class="token punctuation">,</span> <span class="token comment">// f表示一个函数调用,这里的sendTime表示d时间到达时向Timer.C发送当前的时间</span> arg<span class="token punctuation">:</span> c<span class="token punctuation">,</span> <span class="token comment">// arg表示在调用f的时候把参数arg传递给f,c就是用来接受sendTime发送时间的</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token function">startTimer</span><span class="token punctuation">(</span><span class="token operator">&</span>t<span class="token punctuation">.</span>r<span class="token punctuation">)</span> <span class="token keyword">return</span> t <span class="token punctuation">}</span> </code></pre>

定时器的具体实现逻辑,都在 runtime 中的 time.go 中,它的实现,没有采用经典 Unix 间隔定时器 setitimer 系统调用,也没有 采用 POSIX间隔式定时器(相关系统调用:timer_create、timer_settime 和 timer_delete),而是通过四叉树堆(heep)实现的(runtimeTimer 结构中的i字段,表示在堆中的索引)。通过构建一个最小堆,保证最快拿到到期了的定时器执行。定时器的执行,在专门的 goroutine 中进行的:go timerproc()。有兴趣的同学,可以阅读 runtime/time.go 的。

<h3>
使用举例</h3> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token punctuation">(</span> <span class="token string">"fmt"</span> <span class="token string">"time"</span> <span class="token punctuation">)</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//创建定时器,每隔1秒后,定时器就会给channel发送一个事件(当前时间)</span> ticker <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">NewTicker</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second <span class="token operator">*</span> <span class="token number">1</span><span class="token punctuation">)</span> i <span class="token operator">:=</span> <span class="token number">0</span> <span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> <span class="token comment">//循环</span> <span class="token operator"><-</span>ticker<span class="token punctuation">.</span>C i<span class="token operator"> </span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"i = "</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span> <span class="token keyword">if</span> i <span class="token operator">==</span> <span class="token number">5</span> <span class="token punctuation">{</span> ticker<span class="token punctuation">.</span><span class="token function">Stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//停止定时器</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//别忘了()</span> <span class="token comment">//死循环,特地不让main goroutine结束</span> <span class="token keyword">for</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre>

Ticker是一个周期触发定时的计时器,它会按照一个时间间隔往channel发送系统当前时间,而channel的接收者可以以固定的时间间隔从channel中读取事件。

相关函数:

NewTicker()返回一个新的Ticker,该Ticker包含一个通道字段,并会每隔时间段d就向该通道发送当时的时间。它会调整时间间隔或者丢弃tick信息以适应反应慢的接收者。如果d<=0会panic。关闭该Ticker可以释放相关资源。
Stop()关闭一个Ticker。在关闭后,将不会发送更多的tick信息。Stop不会关闭通道t.C,以避免从该通道的读取不正确的成功。

到此这篇关于“go语言-time.Ticker(定时任务实现)”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
go语言-time.Ticker(定时任务实现)
go语言和python哪个难
Go语言的主要特性和发展影响
Go语言学习3----Go语言特色
如何在golang中关闭bufio.reader_golang 并发编程
Go 语言十年而立,Go2 蓄势待发
为何要用go语言
Go 语言到底适合干什么?
兄弟连golang神技(1)-关于 Go 语言的介绍
想学一门新的编程语言?考虑一下Go (Golang)吧

[关闭]
~ ~