go time包

2023-11-12

定时器

在time包中有两个函数可以帮助我们初始化time.Timer

time.Newtimer函数

初始化一个到期时间据此时的间隔为3小时30分的定时器

t := time.Newtimer(3*time.Hour + 30*time.Minute)

注意,这里的变量t是*time.NewTimer类型的,这个指针类型的方法集合包含两个方法

  • Rest

  • 用于重置定时器

  • 该方法返回一个bool类型的值

  • Stop

  • 用来停止定时器

  • 该方法返回一个bool类型的值,如果返回false,说明该定时器在之前已经到期或者已经被停止了,反之返回true。

通过定时器的字段C,我们可以及时得知定时器到期的这个事件来临,C是一个chan time.Time类型的缓冲通道,一旦触及到期时间,定时器就会向自己的C字段发送一个time.Time类型的元素值

示例一:一个简单定时器

package main

import (
    "fmt"
    "time"
)

func main(){
    //初始化定时器
    t := time.NewTimer(2 * time.Second)
    //当前时间
    now := time.Now()
    fmt.Printf("Now time : %v.\n", now)

    expire := <- t.C
    fmt.Printf("Expiration time: %v.\n", expire)
}

Now time : 2015-10-31 01:19:07.210771347 +0800 CST.
Expiration time: 2015-10-31 01:19:09.215489592 +0800 CST.

示例二:我们在改造下之前的那个简单超时操作

package main

import (
    "fmt"
    "time"
)
func main(){
    //初始化通道
    ch11 := make(chan int, 1000)
    sign := make(chan byte, 1)

    //给ch11通道写入数据
    for i := 0; i < 1000; i++ {
        ch11 <- i
    }

    //单独起一个Goroutine执行select
    go func(){
        var e int
        ok := true
        //首先声明一个*time.Timer类型的值,然后在相关case之后声明的匿名函数中尽可能的复用它
        var timer *time.Timer

        for{
            select {
                case e = <- ch11:
                    fmt.Printf("ch11 -> %d\n",e)
                case <- func() <-chan time.Time {
                    if timer == nil{
                        //初始化到期时间据此间隔1ms的定时器
                        timer = time.NewTimer(time.Millisecond)
                    }else {
                        //复用,通过Reset方法重置定时器
                        timer.Reset(time.Millisecond)
                    }
                    //得知定时器到期事件来临时,返回结果
                    return timer.C
                }():
                    fmt.Println("Timeout.")
                    ok = false
                    break
            }
            //终止for循环
            if !ok {
                sign <- 0
                break
            }
        }

    }()

    //惯用手法,读取sign通道数据,为了等待select的Goroutine执行。
    <- sign
}

time.After函数

  • time.After函数, 表示多少时间之后,但是在取出channel内容之前不阻塞,后续程序可以继续执行

  • 鉴于After特性,其通常用来处理程序超时问题

package main

import (
    "fmt"
    "time"
)

func main(){
    ch1 := make(chan int, 1)
    ch2 := make(chan int, 1)

    select {
        case e1 := <-ch1:
        //如果ch1通道成功读取数据,则执行该case处理语句
            fmt.Printf("1th case is selected. e1=%v",e1)
        case e2 := <-ch2:
        //如果ch2通道成功读取数据,则执行该case处理语句
            fmt.Printf("2th case is selected. e2=%v",e2)
        case <- time.After(2 * time.Second):
            fmt.Println("Timed out")
    }
}

Timed out

  • time.Sleep函数,表示休眠多少时间,休眠时处于阻塞状态,后续程序无法执行.

time.Afterfunc函数

示例三:自定义定时器

package main

import (
    "fmt"
    "time"
)
func main(){
    var t *time.Timer

    f := func(){
        fmt.Printf("Expiration time : %v.\n", time.Now())
        fmt.Printf("C`s len: %d\n", len(t.C))
    }

    t = time.AfterFunc(1*time.Second, f)
    //让当前Goroutine 睡眠2s,确保大于内容的完整
    //这样做原因是,time.AfterFunc的调用不会被阻塞。它会以一部的方式在到期事件来临执行我们自定义函数f。
    time.Sleep(2 * time.Second)
}

Expiration time : 2015-10-31 01:04:42.579988801 +0800 CST.
C`s len: 0

第二行打印内容说明:定时器的字段C并没有缓冲任何元素值。这也说明了,在给定了自定义函数后,默认的处理方法(向C发送代表绝对到期时间的元素值)就不会被执行了。

断续器

结构体类型time.Ticker表示了断续器的静态结构。
就是周期性的传达到期时间的装置。这种装置的行为方式与仅有秒针的钟表有些类似,只不过间隔时间可以不是1s。
初始化一个断续器

var ticker *timeTicker = time.NewTicker(time.Second)

示例一:使用时间控制停止ticke

package main

import (
    "fmt"
    "time"
)

func main(){
    //初始化断续器,间隔2s
    var ticker *time.Ticker = time.NewTicker(1 * time.Second)

    go func() {
        for t := range ticker.C {
            fmt.Println("Tick at", t)
        }
    }()

    time.Sleep(time.Second * 5)   //阻塞,则执行次数为sleep的休眠时间/ticker的时间
    ticker.Stop()     
    fmt.Println("Ticker stopped")
}

Tick at 2015-10-31 01:29:34.41859284 +0800 CST
Tick at 2015-10-31 01:29:35.420131668 +0800 CST
Tick at 2015-10-31 01:29:36.420565647 +0800 CST
Tick at 2015-10-31 01:29:37.421038416 +0800 CST
Tick at 2015-10-31 01:29:38.41944582 +0800 CST
Ticker stopped

示例二:使用channel控制停止ticker

package main

import (
    "fmt"
    "time"
)

func main(){
    //初始化断续器,间隔2s
    var ticker *time.Ticker = time.NewTicker(100 * time.Millisecond)

    //num为指定的执行次数
    num := 2
    c := make(chan int, num) 
    go func() {
        for t := range ticker.C {
            c <- 1
            fmt.Println("Tick at", t)
        }
    }()

    time.Sleep(time.Millisecond * 1500)
    ticker.Stop()     
    fmt.Println("Ticker stopped")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go time包 的相关文章

随机推荐

  • spring通过@Value注解注入带默认值的map

    背景 项目开发过程中有需要注入map的需求 但是大部分是不带默认值的配置 这里补充一下String类型默认值的配置方式 注入Map 配置文件中引入配置 test map key1 value1 key2 value2 在任意Bean中增加
  • 我的世界 红石信号 服务器,我的世界0.13.1红石信号延续方式介绍

    今天搞趣网小编为大家带来我的世界0 13 1红石信号延续方式介绍 下面小编为大家详细讲解我的世界0 13 1红石信号延续方式介绍 希望对大家有所帮助 红石电路的从一个信号源发出的信号是有强度限制的 当电路超过15格的距离后信号就会消失 在制
  • Sqli-labs Less18-22 HTTP 头注入 POST

    本文记录 SQL 注入的学习过程 资料为 SQLi SQLi 博客目录 Less 18 POSt Header injection Uagent field Error vased 测试漏洞 源代码 uname check input PO
  • 协调能力体现在哪些方面

    协调能力主 要表现在以下几个方面 1 熟悉和掌握组织现有的人 财 物等资源状况 及时进行资源合理 调配 2 了解不同人的需求和能力特点 在人员配置上做到优势互补 3 有效调动他人完成任务的积极性 4 成功解决工作过程中出现的棘手冲突或矛盾
  • Matlab中fprintf函数使用

    目录 说明 示例 输出字面文本和数组值 将双精度值输出为整数 将表格数据写入文本文件 获取写入文件的字节数 在命令行窗口中显示超链接 fprintf函数将数据写入文本文件 fprintf fileID formatSpec A1 An fp
  • chatGPT回答字数限制解除-怎么突破chatGPT长度的限制

    ChatGPT如何写作 ChatGPT 是一种基于机器学习的自然语言处理技术 可以自动生成文本 包括段落 文章 新闻 电子邮件 推文等 以下是使用 ChatGPT 进行写作的基本过程 确定写作内容和细节 首先需要 确定要生成的文本内容和相关
  • Qt——QMainWindow不同功能栏基础操作总结

    目录 一 菜单栏 二 工具栏 三 状态栏 四 浮动窗口 铆接部件 五 中心部件 中心控件 一 菜单栏
  • windows系统下通过Easybcd安装Ubuntu系统

    本文以ubuntu 14 04为例 但其它版本 比如16 04等都是可以的 不想用虚拟机了 想要在win7系统下安装个ubuntu系统 实现双系统 于是在网上各种搜索 然后综合各种方法 在自己的电脑上进行安装 用了两种方法 一种是通过软件的
  • Android 虚拟 A/B 详解(七) 升级中用到了哪些标识文件?

    本文为洛奇看世界 guyongqiangx 原创 转载请注明出处 原文链接 https blog csdn net guyongqiangx article details 129098176 Android 虚拟 A B 分区 Andro
  • Cogvideo:通过变压器进行文本到视频的大规模预处理

    经过大规模的变压器在文本 GPT 3 和文本形象 Dall E和Cogview 一代中创建了里程碑 它在视频生成上的应用仍面临许多挑战 潜在的巨大计算成本使从头开始培训无法承受 文本视频数据集的稀缺性和弱相关性阻碍了理解复杂运动语义的模型
  • 局域网 git服务器 虚拟机,GitLab服务器傻瓜式搭建教程

    开始前的准备 需要有一台Linux系统的服务器或虚拟机 QAQ 安装包下载地址 https mirrors tuna tsinghua edu cn gitlab ce 注 本教程无需下载安装包 以下教程为CentOS8环境所搭建 第一步
  • 华为eNSP实现外网访问内网,DHCP,easyIP配置案例

    一 需求分析 1 五个部门独立的网络管理 分别不同的VLAN 2 VLAN网关在SW1上 3 边界路由器R1与SW1通过三层互联 4 R1上配置转换技术实现VLAN10 20 40 50上网 财务部不许上网 5 R1上通过最节省IP地址方式
  • UE客户端开发需要哪些知识

    进行UE客户端开发需要以下知识 C 编程语言 UE客户端使用C 作为主要编程语言 因此需要对C 的语法 STL容器 面向对象编程等有深入的理解 Unreal Engine框架 了解UE框架的各个模块 例如Gameplay Framework
  • 单链表的基本操作-单链表的创建、插入、删除结点等

    序言 本文主要包括 1 单链表的创建 2 创建结点 3 打印结点 4 链表的插入 头插法 5 链表的删除 指定位置删除 适合新手初步认识学习单链表的基本操作 各个操作都在一起 也有注释 欢迎大家留言讨论 一 代码 include
  • 动态网站开发02:Java web

    动态网站开发02 一 前言 二 笔记 一 XML基础 1 XML概述 2 XML与HTML的比较 二 XML语法 1 XML文档的声明 2 XML元素的定义 3 XML属性的定义 4 XML注释的定义 5 XML文件示例 三 DTD约束 1
  • 爆肝近3万字解读:程序员必须掌握哪些算法?(含算法的代码实现)

    一个程序员一生中可能会邂逅各种各样的算法 但总有那么几种 是作为一个程序员一定会遇见且大概率需要掌握的算法 今天就来聊聊这些十分重要的 必抓 算法吧 一 引言 1 1 算法的重要性 算法的重要性体现在以下几个方面 解决问题 算法是解决问题的
  • 渗透测试工具备忘单

    https highon coffee blog penetration testing tools cheat sheet
  • @FeignClient使用详细教程(图解)

    FeignClient使用详细教程图解 作用 FeignClient标签的常用属性 使用流程 通俗解释可以把它当成一个spring Bean 可以直接当成一个Service 给 FeignClient 添加Header信息 作用 Feign
  • O2O B2B B2C C2C P2P 名词解释

    O2O O2O 是Online To Offline的缩写即在线离线 线上到线下 是指将线下的商务机会与互联网结合 让互联网成为线下交易的平台 这个概念最早来源于美国 O2O的概念非常广泛 既可涉及到线上 又可涉及到线下 可以通称为O2O
  • go time包

    定时器 在time包中有两个函数可以帮助我们初始化time Timer time Newtimer函数 初始化一个到期时间据此时的间隔为3小时30分的定时器 t time Newtimer 3 time Hour 30 time Minut