基本信息
文件名称:Golang当中的定时器实例详解.docx
文件大小:17.8 KB
总页数:6 页
更新时间:2025-05-21
总字数:约3.31千字
文档摘要

Golang当中的定时器实例详解

目录前言定时器的基本使用总结:

前言

在平时写代码的时候,我们经常会遇到在将来某个时间点或者间隔一段时间重复执行函数。这个时候我们就可以考虑使用定时器。本片文章主要介绍一下golang当中的几个常用的定时器。time.Timer,time.Ticker,time.After以及time.AfterFunc和time.Ticker的基本使用

定时器的基本使用

golang当中的定时器有这个一次性的定时器(Timer)和周期性的定时器(Ticker).在平时的编程当中经常会使用timer当中的ticker,AfterFunc定时器,而NewTicker是每隔多长时间触发,NewTimer是等待多长时间触发一次请注意是只触发一次。请注意一下两者的区别。

下面我们来首先来使用一下这两个定时器首先是这个Timer定时器

packagemain

import(

fmt

time

funcmain(){

myTimer:=time.NewTimer(time.Second*3)//初始化定时器

vari=0

for{

select{

case-myTimer.C:

fmt.Printf(thecounteris%d,i)

myTimer.Reset(time.Second*3)//注意需要重新设置

myTimer.Stop()//不在使用需要将其停止

注意这个timer定时器超时之后需要重新进行设置,才能重新触发。如果上面的代码我们没有Reset,那么就会导致死锁。其实我们也可以看看这个Timer是怎么是实现的

funcNewTimer(dDuration)*Timer{

c:=make(chanTime,1)

t:=Timer{

C:c,//信道

r:runtimeTimer{

when:when(d),//触发时间

f:sendTime,//时间到了之后的调用函数

arg:c,//调用sendTime时的入参

startTimer(t.r)//把定时器的r字段放入由定时器维护协程维护的堆中

returnt

}

从上面的构造函数中可以大概看出定时器的工作流程,这里面最重要的是runtimeTimer。构造定时器的时候会把runtimeTimer放入由定时器维护协程维护的堆中,当时间到了之后,维护协程把r从堆中移除,并调用r的sendTime函数,sendTime的入参是定时器的信道C。可以推断,sendTime中执行的逻辑应该是向信道C中推送时间,通知上游系统时间到了,而事实正是如此:

funcsendTime(cinterface{},sequintptr){

//Non-blockingsendoftimeonc.

//UsedinNewTimer,itcannotblockanyway(buffer).

//UsedinNewTicker,droppingsendsontheflooris

//thedesiredbehaviorwhenthereadergetsbehind,

//becausethesendsareperiodic.

select{

casec.(chanTime)-Now()://时间到了之后把当前时间放入信道中

default:

}

其实这个time.After就是对这个time.Timer的一个封装,所以如果我们上面使用这个time.After那么会频繁的创建time.Timer对象

下面我们在来看一下这个time.AterFunc()定时器。

Golang当中的AfterFunc函数用于等待经过时间,此后在其自己的协程当中调用定义的函数f.函数在时间包下定义。下面我们一起看看如何使用这个

import(

fmt

time

funcmain(){

f:=func(){

fmt.Println(thefunciscallafter3second)

myTime:=time.AfterFunc(time.Second*3,f)

defermyTime.Stop()//定时器不用了需要关闭

time.Sleep(time.Second*4)

下面我们在看看这个tim