美文网首页
golang中的定时器

golang中的定时器

作者: 护念 | 来源:发表于2023-11-15 22:01 被阅读0次

定时器

定时器指的是设定一个时间去做xx事,大体上分为两种:

  1. 设定多少时间后,执行xx事,一次性的。
  2. 设定一个间隔时间,循环的提醒做xx事,循环的多次的。

定时器非常有用,可以用于延时任务、定时执行任务、设置任务超时,定时打印日志等等。
下面我们来一起看下。

1. 一次性提醒(Timer)

a. 最简单的xx时间后提醒

package main

import (
    "log"
    "time"
)

func main() {
    log.Printf("starting logging")
    // 返回的事一个通道 2后会有值进来 这里阻塞2s
    <-time.After(2 * time.Second)
    log.Printf("2s 到啦!")
}

// 2023/11/16 21:19:15 starting logging
// 2023/11/16 21:19:17 2s 到啦!

b. 设置超时

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int) // 初始化一个通道用于做任务

    // 做任务
    go DoTask(ch)

    select {
    case <-ch:
        fmt.Println("任务顺利完成")
    case <-time.After(2 * time.Second):
        fmt.Println("超时啦!")
    }
}

// 做任务
func DoTask(ch chan<- int) {
    // 模拟耗时
    time.Sleep(3 * time.Second)
    ch <- 1
}

c.延时函数

package main

import (
    "fmt"
    "time"
)

func main() {
    // 异步执行 延时多久后执行 函数
    time.AfterFunc(2*time.Second, func() {
        fmt.Printf("延时函数执行啦!")
    })

    // 给定一定时间 让它执行
    time.Sleep(3 * time.Second)
}

d. 一次定时器

time.NewTimer 返回定时器,它有一个C通道,在到时间后会有值弹出,在这之前可以Stop取消定时器;
在定时触发后,可以通过Reset重新设置定时时间;
通常用于构建复杂的定时场景。

package main

import (
    "log"
    "time"
)

func main() {
    log.Printf("开始啦")
    timer := time.NewTimer(3 * time.Second)

    <-timer.C
    log.Printf("首次设置的3s到啦")

    timer.Reset(time.Second) // 再次1s的定时器
    <-timer.C
    log.Printf("再次设置的1s到啦")

    timer.Reset(2 * time.Second) // 再再此设置定时器
    if !timer.Stop() {           // 取消定时 取消有可能不成功
        <-timer.C // 取消不会close通道 因此如果stop成功后调用 timer.C会报deadLock
    }

    log.Printf("由于取消了,所以这里立马执行")
}

// 2023/11/16 21:46:20 开始啦
// 2023/11/16 21:46:23 首次设置的3s到啦
// 2023/11/16 21:46:24 再次设置的1s到啦
// 2023/11/16 21:46:24 由于取消了,所以这里立马执行

2. 循环多次提醒(Ticker)

很容易理解,它的主要特点就是定时提醒;需要注意的是一定要记得Stop它,否则有资源泄漏;

package main

import (
    "log"
    "time"
)

func main() {
    // 间隔1s提醒  它的时间提醒通道也是C
    tick := time.NewTicker(time.Second)
    defer tick.Stop() // 保证资源释放

    i := 0
    for {
        i++
        <-tick.C // 间隔1s有值弹出
        log.Printf("第%d次打印日志", i)
    }
}

// 2023/11/16 21:57:21 第1次打印日志
// 2023/11/16 21:57:22 第2次打印日志
// 2023/11/16 21:57:23 第3次打印日志
// 2023/11/16 21:57:24 第4次打印日志
// 2023/11/16 21:57:25 第5次打印日志
// 2023/11/16 21:57:26 第6次打印日志

相关文章

  • golang中三种定时器的实现方式及周期定时

    一、定时器的创建 golang中定时器有三种实现方式,分别是time.sleep、time.after、time....

  • go语言实现定时器方法

    一、定时器的创建 golang中定时器有三种实现方式,分别是time.sleep、time.after、time....

  • Golang定时器

    http://www.jb51.net/article/61277.htm本文实例讲述了Go语言实现定时器的方法。...

  • golang源码阅读之定时器以及避坑指南

    欢迎访问我的个人网站获取更佳阅读排版体验: golang源码阅读之定时器以及避坑指南 | yoko blog (...

  • 【golang】定时器的使用

    一.一次性定时器Timer,定时器停止timer.Stop(),定时器重置timer.Reset() 二.周期定时...

  • Golang定时器陷阱

    所谓陷阱,就是它不是你认为的那样,这种认知误差可能让你的软件留下隐藏Bug。刚好Timer就有3个陷阱,我们会讲1...

  • golang-定时器

    定时器 和 断续器 定时器:延时某些操作任务断续器:设置的好间隔时间,周而复始的执行任务

  • iOS进阶-谈谈定时器

    目录 iOS提供定时器API 定时器开发中的坑 一、 iOS提供定时器API 二、定时器开发中的坑 2.1、必须办...

  • IOS常见问题分析

    1、定时器问题 1) 定时器在子线程中不启动: 子线程中启动定时器的方法:

  • 并发编程示例

    使用golang的timer 定时任务 断续器 超时 自定义定时器 使用时间控制停止ticker 并发读取文件夹所...

网友评论

      本文标题:golang中的定时器

      本文链接:https://www.haomeiwen.com/subject/duhewdtx.html