去中如何实现固定时长定时器和周期性时长定时器

  介绍

这篇文章主要介绍去中如何实现固定时长定时器和周期性时长定时器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

先来看看下面这段代码:

package 主要      import  (   ,,,“fmt"   ,,,“time"   )      func  main (), {   ,,,timer :=, time.NewTimer (3, *, time.Second)   ,,,fmt.Println(“定时器创建完毕!“)   ,,,fmt.Println (time.Now ())   ,,,//阻塞3秒后才能读出时间   ,,,x :=& lt;作用;timer.C   ,,,//这个C是一个单向的只读管道   ,,,fmt.Println (x)   }

运行结果是这样的:

定时器创建完毕!
2021-08-24 14:02:28.6664158 + 0800 CST m=0.012997601 +
2021-08-24 14:02:31.670071 + 0800 CST m=3.016652801 +

我们可以看的到,运行结果和我们要达到的目的基本一致,三秒的定时器创建完毕后,阻塞三秒后才能读出时间。

我们来看看这个

x :=& lt;作用;计时器。C

根据下面这段代码可知,这个C是一个单向的只读管道:

type  Timer  struct  {   ,,,C  & lt; -chan 时间   ,,,r  runtimeTimer   }

如果要描述一个单向的只写的管道,应该这样写:

C  chan  & lt;作用;时间

但是如果要达到同样的目的,我们可以使用下面这种更简单的方式:

func 主要(),{   ,,,fmt.Println (time.Now ())   ,,,x :=, & lt;作用;还(3 * time.Second)   ,,,fmt.Println (x)   }

使用还()等待规定的一段时间,然后就在返回的管道上发送当前时间。它相当于新时期(d)。c .垃圾收集器不会回收底层的计时器,直到计时器触发才回收。如果需要考虑效率,请改用新时期并在不再需要计时器时调用计时器。停止来结束。

当然我们也可以使用下面这种方法,两种方法都可以:

x :=, & lt;作用;time.NewTimer (3, *, time.Second)。C

刚才固定时长定时器的就是一个定时炸弹设置为三秒钟那三秒钟之后就爆炸,现在我们看看周期性时长定时器吧!

func 主要(),{   ,,,ticker :=, time.NewTicker (1, *, time.Second)      ,,,var 小姐:int   为{,,,   ,,,,,,,x :=& lt;作用;ticker.C   ,,,,,,,fmt.Print (“\ r", x)   ,,,,,,,我+ +   ,,,,,,,if  i> 3 {   ,,,,,,,,,,,//停掉秒表会导致ticker.C永远无法读出数据,   ,,,,,,,,,,,//一定要读会导致死锁。   ,,,,,,,,,,,ticker.Stop ()   ,,,,,,,,,,,休息   ,,,,,,,}   ,,,}   ,,,fmt.Println(“计时结束“)   }

这段代码的意思是,设置一个周期性时长定时器,然后每一秒从管道内读一次数据,然后输出直到i> 3,就使用ticker.Stop()将定时器结束,然后停止循环,然后告诉你计时结束。

如果将定时器结束后,你仍然要坚持读,就会出现下面这种情况!

致命错误:所有了goroutine睡着了——僵局!

出现死锁!所以这里需要用到休息。

以上是“去中如何实现固定时长定时器和周期性时长定时器”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

去中如何实现固定时长定时器和周期性时长定时器