介绍 Golang Timer(定时器)

2023-11-06

介绍 Golang Timer(定时器)

本文介绍Golang Timer(定时器),位于Golang 的time包。常用于衡量代码执行效率。

示例

假设一个业务方法需要衡量其执行效率,整个执行时间不能超过60秒,一旦超过发送通知。

实现一

package main

import (
    "time"
    "fmt"
)

const time_in_seconds = 60

func main() {
    // 60 second timer.
    timer := time.NewTimer(time.Second*time_in_seconds)
    defer timer.Stop()
    
    // 等待定时器完成异步任务
    go func() {
        // 阻塞直到定时器完成。时间到了发送消息给通道 timer.C
        // 该协程中没有其他代码执行
        <-timer.C

        // 如果main() 在60秒之前完成,下面代码不会执行
        fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
    }
    
    // 执行一个耗时方法
    executeTheCodeThatMightTakeMoreThanSixtySeconds()
    
    // main()函数完成,所以定时器结束.
}

实现二

对上面示例进行重构,抽取定时器为工具函数:

package main

import (
  "time"
  "fmt"
)

const time_in_seconds = 60

func main() {
  // 设定60秒定时器,时间到了调用发送消息函数
  timer := NewTimer(time_in_seconds, func() {
    fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
  })
  defer timer.Stop()
  
  // 执行一个耗时方法
  executeTheCodeThatMightTakeMoreThanSixtySeconds()
}

// NewTimer创建定时器并运行给定时间,当时间到了调用通知函数
// 最后返回定时器,用于需要时可提前停止定时器
func NewTimer(seconds int, action func()) *time.Timer {
  timer := timer.NewTimer(time.Seconds * time.Duration(seconds))
  
  go func() {
    <-timer.C
    action()
  }
  
  return timer
}

time.AfterFunc

起始time已经提供了工具函数AfterFunc,完全能够实现前节功能:

timer := time.AfterFunc(time.Second*60, func() {
    fmt.Printf("Congratulations! Your %d second timer finished.", time_in_seconds)
})
defer timer.Stop()

总结

本文介绍了Time定时器,结合示例说明time.AfterFunc工具函数的应用场景。同时也涉及了协程、通道等Golang最酷的特性。

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

介绍 Golang Timer(定时器) 的相关文章

  • 如何制作一个在主线程中触发事件的 C# 计时器?

    长话短说 我需要 Net 中的一个精确计时器 精度以毫秒为单位 这意味着 如果我告诉它在 10 毫秒过去时触发一个事件 它必须这样做 1 毫秒 内置的 Net Timer 类的精度似乎为 16ms 这对于我的应用程序来说是不可接受的 我找到
  • 了解 C# 中 Timer 控件的工作原理

    假设我有一个计时器控件 间隔设置为 20 毫秒 在这个控件中 我正在执行一些需要 100 毫秒才能完成的操作 那么一旦执行该操作 Timer 控件是否会再次执行而不等待该操作完成 或者直到该操作未完成时 Timer 才会再次执行 EDIT我
  • setTimeout 的最小毫秒值是多少?

    我想把 var minValue 0 if typeof callback function setTimeout callback minValue 当我用 JavaScript 实现回调函数时 这段代码 但我发现现代浏览器和一些旧浏览器
  • 如何实现带进度条的闪屏? - 安卓

    我在启动时有一个闪屏 与以下编码 public class Splash extends Activity Override protected void onCreate Bundle savedInstanceState TODO Au
  • C++ 非阻塞异步定时器

    我读过很多关于这个问题的帖子 但没有找到这个问题的答案 我想制作一个在后台运行并在完成后执行某些操作的计时器类 甚至我想一次调用多个异步倒计时的计时器 我在搜索这个类时发现了它 它似乎有效 但不在后台 我怎样才能将它转换为我想要的 Time
  • 如果前一个线程仍然繁忙,如何让计时器跳过刻度

    我创建了一个 Windows 服务 该服务应该每 60 秒检查数据库中的某个表是否有新行 对于添加的每个新行 我都需要在服务器上进行一些繁重的处理 有时可能需要 60 秒以上的时间 我在服务中创建了一个 Timer 对象 该对象每 60 秒
  • iOS 中屏幕关闭/设备锁定时定时器不运行

    应用程序位于后台 在与 BLE 设备断开连接时会收到回调 之后应用程序必须等待一段时间 1 分钟 然后执行一些代码 如果屏幕打开 即使在后台 应用程序也会按预期运行 但是 如果屏幕关闭 则计时器将无法工作 并且应用程序不会按预期执行 这是
  • 如何在 Swift 中的自定义类中初始化 Timer? [复制]

    这个问题在这里已经有答案了 我制作了一个简单的计时器应用程序 但是 现在我想让它变得更好 并且我想为计时器控件编写一个类 class Cronometer private var counter Int 0 private var time
  • 每秒(或更短时间)检查 url 是否有效的最佳方法是什么,在 C# 窗口窗体应用程序 (.NET) 中使用 Task wait 或 ContinueWith

    我是 C Net 和 Visual Studio 2022 的新手 我想要实现的是每秒运行一个计时器来检查网站 url 是否有效 是否已启动 如果 url 可访问并且当前 WebView2 未显示该网站 那么它应该导航到该网站 如果它已经显
  • System.currentTimeMillis 的长度

    Does System currentTimeMillis始终返回固定长度的值 在我的 Windows Core2 中 它返回一个 13 位长的值 从它的 API 来看 返回当前时间 以毫秒为单位 请注意 虽然返回值的时间单位是毫秒 但该值
  • 如何在运行时更改android中睡眠/定时器线程的延迟?

    我试图做的是每次计数器变为 5 的倍数时减少计时器延迟 但是 一旦代码进入 if 块 它就停止递增计时器 我不明白发生了什么事 这是代码 thread new Thread public void run try if count 5 0
  • Android:定时器/延迟替代方案

    我想让一个图像在 60 毫秒内可见 然后不可见 然后我想让另一个图像执行相同的操作 等等 我认为我没有正确使用计时器 因为当我运行该应用程序时 两个图像会同时打开 并且当我按下使用此功能的按钮时 两个图像不会消失 这是一些示例代码 time
  • C 中的非阻塞睡眠定时器

    我正在为 Windows 寻找一个很好的 C 语言非阻塞睡眠定时器 目前我正在使用sleep 10 这当然是一个阻塞计时器 另外 我希望它不消耗系统资源 就像我的睡眠计时器一样 它不使用任何我满意的 CPU 或系统资源 那么 我可以使用的最
  • Linux下如何用C实现定时器的回调函数

    我已经在许多论坛上搜索了几天可能的解决方案 但没有运气 我在这里发布我的问题 非常感谢您的回复 主意 使用脚本控制灯光 Linux下C语言 应用场景 我有三盏灯 红 蓝 绿 脚本有控制它们的时间表 例如 从现在起10秒后 亮红灯2秒 从现在
  • 如何在Android中制作倒计时器?

    我有两个 XML 格式的 EditText 在一个 EditText 中 用户可以输入一个数字作为分钟 在另一个 EditText 中输入一个数字作为秒 单击完成按钮后 EditText 应该开始倒计时并每秒更新其文本 此外 我怎样才能保持
  • 计时器、事件和垃圾收集:我错过了什么吗?

    考虑以下代码 class TestTimerGC Form public TestTimerGC Button btnGC new Button btnGC Text GC btnGC Click sender e gt GC Collec
  • 在 Android 中的计时器内运行异步任务

    我正在开发一个基本的聊天类型应用程序 目前我正在运行代码 如下所示 class GetMsgs extends AsyncTask
  • 定时器启动/停止参数

    自从加入这个社区以来 我在技能和进步方面取得了突飞猛进的进步 你们都是一个巨大的帮助 我无法提供一个计时器 该计时器已在启动和停止时实现了某些参数 我要么收到错误消息 局部变量计时器可能尚未初始化 要么没有收到错误消息 但什么也没有发生 也
  • 线程睡眠阻止我的 Swing 应用程序执行

    我的应用程序发生的事情是有道理的 但我不知道如何修复它 以下是我的应用程序功能的简要描述 计时器窗口应显示在屏幕右下角并显示实时时间 一小时后 它应该执行一些操作 我还没有决定该操作 我面临的问题是定时器 java当我刷新实时计时器的秒数时
  • 如何在Windows上用C语言实现定时器

    如何在 C 中创建一个计时器 时间到期后 我应该能够调用回调函数 平台是windows 有人可以指导我吗 问候 米敦 看一眼SetTimer http msdn microsoft com en us library ms644906 28

随机推荐

  • 使用R语言绘制ovarian数据集中病例年龄分布的直方图

    使用R语言绘制ovarian数据集中病例年龄分布的直方图 直方图是一种常用的数据可视化工具 用于展示连续变量的分布情况 在R语言中 我们可以使用hist 函数轻松地创建直方图 本文将展示如何使用R语言绘制ovarian数据集中病例年龄的分布
  • String、StringBuffer和StringBuilder三者之间的区别

    最基本的区别就是String是一个字符串常量 长度不可改变 StringBuffer和StringBuilder是字符串变量 他们两个的长度可以改变 但StringBuffer是线程安全的 而StringBuilder是非线程安全的 Str
  • ** LeetCode 刷题 459

    这是一道我没做出来的简单题 5555 学习 方法1 移动匹配 如果一个字符串可以由一个字串重复获得 那么将两个相同字符串并起来 一定可以在中间再找到该字符串 class Solution public bool repeatedSubstr
  • JavaEE-过滤器和监听器 案例分析

    目录 过滤器和监听器 什么是过滤器 过滤器编程接口 接口Filter的主要方法 设计过滤器 实例1 编写一个过滤器审计用户对资源的访问 什么是监听器 监听器编程接口 设计监听器 实例 编写一个HttpSession事件监听器用来记录当前在线
  • Python pandas读取Excel 数据写入到数据库

    需求得到天眼查的法人信息数据导入到数据库中 经过多次不断试错最后使用Python导入 先上代码 import pandas as pd import sqlalchemy as sqla import os 读取Excel数据 def ge
  • net::ERR_HTTP2_PROTOCOL_ERROR 200错误

    场景 web端的环境上某一个请求报这个问题了 其他的请求正常 打开f12控制台看到异常net ERR HTTP2 PROTOCOL ERROR 200错误 排查 查看nginx的error log 报是某一个临时文件的权限不足 原因是启动n
  • CSVDE导出AD域下指定子OU的Group中所有成员的信息

    CSVDE导出AD域下指定子OU的Group中所有成员的信息 最近搞CSVDE搞的头疼 网上各种乱七八糟的资料 都是东搞一下西搞一下 好不容易找到一篇系统性的介绍使用CSVDE来对AD进行导入导出操作的文章 具体链接 http www co
  • mybatis(六) 处理枚举类型

    处理枚举类型 若想映射枚举类型 Enum 则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用 比如说我们想存储取近似值时用到的舍入模式 默认情况下 MyBatis 会利用 EnumT
  • python数据清洗的三个常用的处理方式!

    关于python数据处理过程中三个主要的数据清洗说明 分别是缺失值 空格 重复值的数据清洗 这里还是使用pandas来获取excel或者csv的数据源来进行数据处理 若是没有pandas的非标准库需要使用pip的方式安装一下 pip ins
  • 华为OD机试真题-分班-2023年OD统一考试(B卷)

    题目描述 幼儿园两个班的小朋友在排队时混在了一起 每位小朋友都知道自己是否与前面一位小朋友是否同班 请你帮忙把同班的小朋友找出来 小朋友的编号为整数 与前一位小朋友同班用Y表示 不同班用N表示 输入描述 输入为空格分开的小朋友编号和是否同班
  • 深度网络架构的设计技巧<一>:Can CNNs Be More Robust Than Transformers?

    导读 启发于Transformer结构 作者将三种设计引入到CNN中 加强后的CNN取得比ViT更强的鲁棒性 这三种设计 实现简单 仅仅几行代码就能实现高效的CNN结构设计 ArXiv https arxiv org abs 2206 03
  • 数据挖掘的基础

    目录 数据挖掘 一 数据挖掘理解 二 数据准备 1 缺失值处理 2 异常值处理 3 数据偏差的处理 4 数据的标准化 5 特征选择 三 数据建模 1 分类问题 2 聚类问题 3 回归问题 4 关联问题 四 评估模型 1 混淆矩阵与准确率指标
  • C语言删除一个字符串中的多余空格字符

    删除一个字符串中的多余空格字符 使得字符串中的每个单词之间只有一个空格字符 code C C char my delblank char str char newStr char start str while start start st
  • 2021年计算机保研经验帖(真平民)(上交网安、复旦、南大、同济、北航、东南)

    个人背景 中九5 数学辅修 数模省一 组织经历较丰富 干啥啥不行 活动第一名 软著及项目若干 无论文无科研 什么叫学混啊 有强烈的上海和南京倾向 有倾向是好事 但是也不要过于自信 因为各个学校的审核很迷 还是要适当海投保证自己有学上 夏令营
  • (二):Qt信号槽连接及触发原理

    经过 Qt信号槽之 准备阶段 学习 我们知道信号是函数 里面调用了 QMetaObject activate 函数 而对于接收端的槽函数或信号 是通过私有静态函数 qt static metacall 调用元方法 源头是有的 接收端也是有的
  • 【Vue学习笔记6】好用的 Vueuse 工具包

    1 安装Vueuse VueUse 的官方 https vueuse org 的介绍说这是一个 Composition API 的工具集合 适用于 Vue 2 x 或者 Vue 3 x 用起来和 React Hooks 还挺像的 VueUs
  • Altium Designer 13 设计备忘录7——如何让过孔/地孔覆铜全覆盖

    通常在PCB布线布局完成后 都会开始对整块板子进行覆铜 这时可能会出现以下过孔 地孔无法全覆盖的情况 通过菜单栏上的设计 Design 规则 R 找到Plane 选择Polygon Connect Style下 PolygonConnect
  • idea新建文件时没有xml文件的处理办法

    1 大部分人在新建spring项目时 会发现新建项目时没有xml文件的选项 如下图所示 2 此问题是pom文件没有正确引入依赖导致的 可以尝试在pom文件中加入spring依赖尝试一下 在pom文件中加入以下依赖 并且更新maven
  • VS编译OpenCV3

    目录 流程 源码 环境 编译完成库 流程文档转载 防丢 1 下载Cmake 2 下载OpenCV源码 3 编译OpenCV 4 最后一步 VS编译openCV 4 1编译Debug版的openCV 4 2编译Release版的openCV
  • 介绍 Golang Timer(定时器)

    介绍 Golang Timer 定时器 本文介绍Golang Timer 定时器 位于Golang 的time包 常用于衡量代码执行效率 示例 假设一个业务方法需要衡量其执行效率 整个执行时间不能超过60秒 一旦超过发送通知 实现一 pac