首页 > 其他分享 >Go语言中,定时器有 2种 实现方法,分别是什么 ?

Go语言中,定时器有 2种 实现方法,分别是什么 ?

时间:2022-11-23 09:22:07浏览次数:51  
标签:定时器 语言 fmt Println time Go 定时 foo

商务合作加微信:LetsFeng

图片

goland 全家桶激活码,支持所有版本,支持所有系统

链接:http://web.52shizhan.cn/activity/s2abxc

提取码:GJF9B1DK

 

现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.


图片

图片



golang的sdk做了太多的东西,定时器在golang里实现起来非常的简单

两种方式

  • NewTicker()

  • NewTimer()

     

代码如下

NewTicker() 方式

func foo() {
 fmt.Println("foo() start.")
 time.Sleep(time.Second * 3)
 fmt.Println("foo() end.")
}

func TestTicker(t *testing.T) {
 ticker := time.NewTicker(time.Second * 2)
 // 清理计时器
 defer ticker.Stop()
 for {
  fmt.Println("ticker start ", time.Now().Format("15:04:05"))
  foo()
  <-ticker.C
 }
}

运行结果

图片

NewTimer() 方式

func foo() {
 fmt.Println("foo() start.")
 time.Sleep(time.Second * 3)
 fmt.Println("foo() end.")
}

func TestTimer(t *testing.T) {
 timer := time.NewTimer(time.Second * 2)
 // 清理计时器
 defer timer.Stop()
 for {
  fmt.Println("ticker start ", time.Now().Format("15:04:05"))
  foo()
  <-timer.C
 }
}

 

运行结果

图片

 

可以看到,就执行了两次就不动了

原因:NewTicker() 启动后,会自己维护一个过期时间的通道(Channel)也就是代码里的 <-ticker.C 这句意思就是时间一到,ticker会通过管道发出一个信号给CPU,告诉CPU时间到了,该执行定时里的方法了,信号发出后,ticker会自动的重置定时的剩余时间,然后再进行下一轮的发送信号执行方法

 

但NewTimer()看源码会发现,它在sleep.go文件里定义的,也就是说NewTimer()相当于一个睡眠(延时执行)。

时间一到,timer会通过管道发出一个信号告诉CPU该执行定时里的代码了,然后这个管道就销毁了,除非使用 timer.Reset(time.Duration * 2) 来重新激活这根管道,让它重置定时的剩余时间,到下一轮定信号发出后,还要再次重置

 

所以在用定时时,还是NewTicker()方便

值得一提的是,当定时任务执行时间过长且超过定时的间隔时间时,定时的间隔时间到了之后会等待定时任务执行完才会进行下一轮的定时任务.

 

 

 

文章首发:https://www.jb51.net/article/206348.htm

 

 

更多相关Go语言的技术文章或视频教程,请关注本公众号获取并查看,感谢你的支持与信任!

 

标签:定时器,语言,fmt,Println,time,Go,定时,foo
From: https://www.cnblogs.com/cheyunhua/p/16917192.html

相关文章

  • NopCommerce多语言的实现
    通过语言包xml文件导入导出语言字符串数据库方面,以下数据表:LanguageLocaleStringResourceLocalizedProperty接口IWorkContext真正实现类是Nop.Web.Framework.WebWorkC......
  • Django目录说明
    templats目录用途存放HTML文件配置在Django项目目录中的settings.py文件中添加'DIRS':[BASE_DIR/'templates']   static目录用途需要新建一个static目录......
  • 创建一个Django项目
    pycharm创建Django项目   使用命令创建创建一个Django项目django-adminstartproject项目名创建一个apppython3manage.pystartappAPP名称 ......
  • 当resource bundle 的多语言文件里包含引号'时
    背景项目中使用Spring的ReloadableResourceBundleMessageSource这个类来实现多语言,有一次字符串里包含引号'时,解析时出了问题,一起来看一下吧例子resources下包含三个语......
  • 安装Django
    使用pycharm安装   命令安装安装好后,Django将被安装于虚拟环境下的site-packages/目录下。附各个Django版本的维护时间......
  • 解决方案(14) golang pprof接入业务同端口
    前言声明:本文不对pprof基础做讲解,详情可以查阅https://studygolang.com/pkgdoc找到net/http/pprofgolangpprof官方介绍里,是采用了默认6060端口,单独开辟了应用进程的ppr......
  • golang 微信支付计算签名
    原文:1、签名算法(签名校验工具)签名生成的通用步骤如下:第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键......
  • js和go对接websocket遇到的问题汇总
    TableofContentsgeneratedwithDocToc​​1.包协议​​​2.相关操作​​​2.1大端编码​​​​2.2大端解码​​​​2.3string转utf8-uint8Array[],utf8-uint8Arra......
  • 如何给旧版的go仓库,添加go1.12兼容
    需要确认GOROOT在1.12以上,并且,GO111MODULE必须为ongomodinitgithub.com/****/projectNamegomodtidy当出现依赖的第三方包版本不一致时。修改go.mod,比如uuid包的某次has......
  • go 1.12以下,给服务器增加包依赖的自动化脚本
    前言旧版的go不支持module,所以包依赖需要手动引入。本文仅记录用过的脚本,方便以后复制。需要对具体的包增加具体的脚本#本脚本,需要在服务上预先配置好go1.9,GOPATH,GOROO......