首页 > 其他分享 >go NewTicker 得使用

go NewTicker 得使用

时间:2023-07-07 20:34:18浏览次数:34  
标签:NewTicker 定时器 触发 使用 time go ticker 通道

转载请注明出处:

  在 Go 语言中,time.NewTicker 函数用于创建一个周期性触发的定时器。它会返回一个 time.Ticker 类型的值,该值包含一个通道 C,定时器会每隔一段时间向通道 C 发送一个时间值。 NewTicker 函数的签名如下:

func NewTicker(d Duration) *Ticker

  其中,d 是一个表示时间间隔的 time.Duration 类型的值。 使用 NewTicker 的一般步骤如下:

  1. 调用 NewTicker 函数创建一个定时器对象。

  2. 使用 Ticker.C 通道进行循环读取,每次读取都会阻塞直到定时器触发。

  3. 在定时器触发后执行相应的操作。   

  下面是一个简单的示例代码,演示了如何使用 NewTicker

package main
import (
    "fmt"
    "time"
)
func main() {
    ticker := time.NewTicker(1 * time.Second) // 创建一个每秒触发一次的定时器
    defer ticker.Stop() // 在结束时停止定时器
    done := make(chan bool) // 创建一个通道用于结束循环
    go func() {
        time.Sleep(5 * time.Second) // 等待5秒后结束循环
        done <- true
    }()
    for {
        select {
        case <-done:
            fmt.Println("循环结束")
            return
        case t := <-ticker.C:
            fmt.Println("定时器触发:", t)
            // 在这里执行定时器触发后的操作
        }
    }
}

  在上述代码中,创建了一个每秒触发一次的定时器 ticker。然后使用一个 done 通道来控制循环的结束,在另一个 goroutine 中等待 5 秒后向 done 通道发送数据。在主 goroutine 的循环中,使用 select 语句监听 done通道和 ticker.C通道,如果 done 通道接收到数据,则循环结束;如果 ticker.C 通道接收到数据,则定时器触发,执行相应的操作。

  运行上述代码,每秒钟会打印一次 "定时器触发" 信息,连续打印 5 秒后,程序输出 "循环结束" 并结束循环。这个示例展示了如何使用 NewTicker 创建一个周期性触发的定时器,并在定时器触发后执行相应的操作。

  也可以通过 for 循环遍历ticker 通道进行任务执行,代码示例如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(1 * time.Second) // 创建一个间隔为1秒的定时器
    defer ticker.Stop()                       // 在不再需要时停止定时器

    go func() {
        for range ticker.C {
            fmt.Println("Tick at", time.Now())
        }
    }()

    time.Sleep(5 * time.Second) // 睡眠5秒,模拟其他工作
}

 

标签:NewTicker,定时器,触发,使用,time,go,ticker,通道
From: https://www.cnblogs.com/zjdxr-up/p/17535991.html

相关文章

  • Java线程池详解:Future的使用和实现
    提交到线程池中执行的异步任务都会返回一个任务的Future,所以这里先介绍一下Future的使用和实现。异步任务通常会被提交到线程池中去执行,但任务并非提交到线程池后就不管不顾了,在某些时刻我们希望能够取消任务,同时也希望在任务执行完成后获取到任务的执行结果。Java提供了Futur......
  • mongodb数据迁移
    mongodb数据迁移操作--备份单个表mongodump-usuperuser-p123456--port27017--authenticationDatabaseadmin-dmyTest-cd-o/backup/mongodb/myTest_d_bak_201507021701.bak--备份单个库mongodump-usuperuser-p123456--port27017--authenticationD......
  • CH32V003使用ADC八通道转换注意事项
    本文以CH32V003_F4P6(20Pin)为模板 1、PA1、PA2为外部晶振输入引脚,同时也是ADC的CH1与CH0,所以需要先在system_ch32v00x.c文件中更改为内部48M的宏即可。注:CH32V003的ADC数据寄存器为10,通道转换值为[0-1024],精度为VCC/1024,VCC与外部参考电压相同[2.8-5.5]  2、ADC初......
  • Python | glob模块使用
    glob模块简介glob模块可以查找符合特定规则的文件路径名,用来查找文件目录和文件,并将搜索的到的结果返回到一个列表中。常见的两个方法有glob.glob()和glob.iglob(),类似windows下的文件搜索。glob支持*?[]这三种通配符。glob模块的使用导入方法:importglob #导入整个glob模......
  • 在 kubernets pod 里使用 perf 直接调试 rust 程序
     我们想要了解我们程序在运行时候的真实情况,但是感觉rust性能方面的调试真的比go麻烦非常多。首先在rustcargo.toml中添加[profile.release]debug=true 直接在pod里面进行调试限制比较多,首先我们可能需要安装一些必要的东西比如perf本体在ubuntu的环境......
  • Buildroot创建ramdisk、ext4、ubifs镜像,以及mkfs.ext4/mkfs.ubifs/cpio的使用
    通过mkfs.ext4和mkfs.ubifs可以生成ext4和ubi格式的文件系统文件。Buildroot中创建文件系统文件即借助这两个命令。1.mkfs.ext4mkfs.ext4以及mkfs.ext2/mkfs.ext3都指向mke2fs,用于创建ext4格式的文件系统。Usage:mkfs.ext4[-c|-lfilename][-bblock-size][-Ccluster-si......
  • Java中使用BufferedReader类来读取大文本文件
    importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;publicclassReadLargeTextFile{publicstaticvoidmain(String[]args){Filefile=newFile("large_file.txt");try......
  • Docker.DotNet 库的使用(二)— 项目结构(选看)
    前言:本来想随便搭一个项目主要是介绍库的使用,搭着搭着变了样......
  • 关于通过bat脚本-自动使用mstsc-远程桌面命令登录到远程windows主机的方法
    在Windows系统中,我们可以通过系统自带的mstsc远程桌面工具,登录到远端的windows服务器主机但是需要输入用户名和密码,回车、于是笔者想了一下,能不能创建一个bat文件,双击后,就会自动的传入用户名和密码进行登录经过查询和实验、还真有这样的办法(当然在正式的环境,不建议这样操作,因为......
  • python multiprocessing库使用记录
    pythonmultiprocessing库使用记录需求是想并行调用形式化分析工具proverif,同时发起对多个query的分析(378个)。实验室有40核心80线程的服务器(双cpu,至强gold5218R*2)。观察到单个命令在分析时内存占用不大,且只使用单核心执行,因此考虑同时调用多个命令同时执行分析,加快结果输出。......