Golang学习笔记:定时器

转载请注名出处:https://blog.csdn.net/sublio/article/details/106477855

全系列目录:https://blog.csdn.net/sublio/article/details/106480267

Timer和Ticker

目录

Timer和Ticker

Timer(一次)

Ticker(循环)

参考文档


Timer(一次)

  1. 不能直接用复合字面量来初始化(有一个包级的私有字段,不能忽略它的初始化,由于是包级别的,也不能在外面初始化)。

  2. time.NewTimer(time.Duration)初始化。

    1. 例子:timer := time.NewTimer(3 * time.Hour + time.Minute)

    2. 到期后向其通知通道(timer.C)发送到期的绝对到期时间(初始化时间 + 相对到期时间)。

    3. timer.C是类型为chan time.Timer的接受通道(定时器内部为双向,可以向它发送元素)。

    4. timer.C的长度为1。

    5. time.NewTimer(time.Duration).C等价于time.After(time.Duration)。

  3. time.AfterFunc(d Duration, f func())

    1. 第一个参数表示相对到期时间。

    2. 第二个参数表示到期时需要执行的函数。

    3. 到期后不会向通知channel发送通知,而是启用一个goroutine调用传入的函数。

  4. Timer.Stop

    1. 返回一个bool值。

    2. 返回false时表示 定时器已经过期;已经被停止。

    3. 在定时器到期之前Stop返回true,之后C就没有机会缓冲任何元素了(重置之后又可以了),如果此时C里面有一个元素值,它就会一直在那里,直到被接收,之后再想从里面接收任何元素是不会有结果的,还会导致goroutine的永久阻塞,因此在重置之前一定不要对其进行接收操作。

  5. Timer.Reset

    1. 返回值的含义与Stop一样。

    2. 返回值与重制是否成功无关。

    3. 定时器到期后,如果C里面旧的通知没有被接收走,该字段就会缓冲着这个元素值,重置之后也还是在里面,由于C的长度为1,重置之后到期的新通知会被丢弃(不会导致堵塞),因此,想要复用必须要保证旧的通知被接收掉。

  6. 相对到期时间应该传入正整数,不然没有意义。

Ticker(循环)

  1. time.NewTicker(time.Duration)初始化。

  2. Timer.Stop和timer的功能相似,一旦停止,它就不会向C发送任何元素值了,如果此时C里面有一个元素值,它就会一直在那里,直到被接收。

  3. 没隔周期时间就会向C进行一次发送操作,C的长度为1,如果下次发送的时候发现C还未被接收,就取消发送操作(这一点与timer一致)。

 

参考文档

《Go并发编程实战(第2版)》——郝林

你可能感兴趣的:(GoLang,基础)