当前位置: 首页 > news >正文

Go语言定时器Timer和Ticker到底怎么用

原文链接,可获取更多Go语言学习资料

概述

在日常开发中,我们不可避免的需要使用到定时任务用来处理业务逻辑。在Go语言中内置的有两个定时器,TimerTicker,合理的使用这两个定时器可以很好的解决定时任务的需求,同时除了这两个内置的定时器外,还有另外的三方库也可以用来完成定时任务的需求。

Timer

简介

Timer定时器可以在指定时间后执行一次,使用time包中的NewTimer方法传入间隔时间参数即可创建一个Timer定时器,定时器将会在指定的时间后执行一次。
Timer中共有以下方法可调用

// 创建
func NewTimer(d Duration) *Timer
// 重置
func (t *Timer) Reset(d Duration) bool
// 停止
func (t *Timer) Stop() bool

Timer中除了有以上方法之外,还有最重要的就是Timer中包含一个时间类型的通道C,当指定时间间隔到达后,就会将当前时间发送到通道C中,这样我们可以使用select监听通道C即可完成在指定时间后执行任务的需求。

基础用法

我们根据上面的描述,完成了下面的代码:

func main() {// 创建一个Timer定时器timer := time.NewTimer(time.Second * 2)// 延迟关闭定时器defer timer.Stop()fmt.Println("当前时间:", time.Now())select {// 使用select监听通道Ccase nowTime := <-timer.C:fmt.Println("间隔2秒后指定定时任务,当前时间:", nowTime)}
}

在idea中运行代码后会输出以下内容:

当前时间: 2024-06-30 15:12:08.7736065 +0800 CST m=+0.002108801
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:12:10.7797079 +0800 CST m=+2.008210201Process finished with the exit code 0

可以看到,Timer定时器在指定时间后会执行一次任务,然后结束。

Reset使用

在上面的代码中可以看到Timer在指定时间后仅能执行一次任务,但是我们可以使用Reset方法重置定时器,这样的话可以在每次执行任务后重置,用来达到每间隔指定时间都执行一次任务的需求。
将代码略做修改如下:

func main() {// 创建一个Timer定时器timer := time.NewTimer(time.Second * 2)// 延迟关闭定时器defer timer.Stop()fmt.Println("当前时间:", time.Now())for {timer.Reset(time.Second * 2)select {// 使用select监听通道Ccase nowTime := <-timer.C:fmt.Println("间隔2秒后指定定时任务,当前时间:", nowTime)}}
}

在上面代码中可以看到在每次的循环中都重置一次Timer定时器,这样的话就可以实现每隔一段时间都执行一次任务的需求。
最终运行结果如下:

当前时间: 2024-06-30 15:16:01.2907834 +0800 CST m=+0.002052801
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:03.3096846 +0800 CST m=+2.020954001
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:05.3236498 +0800 CST m=+4.034919201
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:07.3318153 +0800 CST m=+6.043084701
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:09.3462966 +0800 CST m=+8.057566001
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:11.3504773 +0800 CST m=+10.061746701
……

Ticker

简介

Ticker定时器的用法和Timer定时器的用法以及内置的方法都一样,区别在于Ticker不仅仅只执行一次,而是会根据指定的时间间隔不停地执行。

基础用法

代码如下:

func main() {ticker := time.NewTicker(time.Second * 2)defer ticker.Stop()fmt.Println("当前时间:", time.Now())for {select {case nowTime := <-ticker.C:fmt.Println("间隔2秒后指定定时任务,当前时间:", nowTime)}}
}

根据Ticker写出以上代码,代码会每隔2秒执行一次,不需要像Timer中那样每次使用Reset方法来重置定时器,最终运行结果如下:

当前时间: 2024-06-30 15:20:27.4070592 +0800 CST m=+0.002137901
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:29.4083801 +0800 CST m=+2.003458801
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:31.414517 +0800 CST m=+4.009595701
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:33.4191099 +0800 CST m=+6.014188601
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:35.4099723 +0800 CST m=+8.005051001
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:37.4208446 +0800 CST m=+10.015923301
……

Ticker定时器中同样也有Reset方法,但是就算不调用Reset方法定时器也会一直执行,所以这里的Reset方法可以用来重置定时器的间隔时间。

区别

  • Ticker定时器表示每隔一段时间就执行一次,一般可执行多次。
  • Timer定时器表示在一段时间后执行,默认情况下只执行一次,如果想再次执行的话,每次都需要调用Reset方法,此时效果类似Ticker定时器。同时也可以调用Stop方法取消定时器。

相关文章:

Go语言定时器Timer和Ticker到底怎么用

原文链接&#xff0c;可获取更多Go语言学习资料 概述 在日常开发中&#xff0c;我们不可避免的需要使用到定时任务用来处理业务逻辑。在Go语言中内置的有两个定时器&#xff0c;Timer和Ticker&#xff0c;合理的使用这两个定时器可以很好的解决定时任务的需求&#xff0c;同时…...

41、web基础和http协议

web基础与http协议 一、web web&#xff1a;就是我们所说得页面&#xff0c;打开网页展示得页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; world wide webwww 分布式图形信息系统 http&#xff1a;超文本传输协议 https&#xff1a;加密的超文本传输协议…...

6-173 二分查找的关键字比较次数

6-173 二分查找的关键字比较次数 - &#xff08;32&#xff09;专科段数据结构专项练习&#xff08;2024版&#xff09; (pintia.cn) int CountSearchTimes(int a[], int low, int high, int x) {int time0;while(low < high){int mid(lowhigh)/2;time;if(a[mid]x)return t…...

【基础篇】第5章 Elasticsearch 数据聚合与分析

在Elasticsearch的庞大功能体系中&#xff0c;数据聚合与分析扮演着至关重要的角色&#xff0c;它使我们能够从海量数据中提炼出有价值的信息&#xff0c;为决策提供依据。本章将深入探讨Elasticsearch的聚合功能&#xff0c;从基本概念到常见类型的实践&#xff0c;让你掌握如…...

【网络安全】修改Host文件实现域名解析

场景 开发一个网站或者服务&#xff0c;需要在本地测试时&#xff0c;可以将线上的域名指向本地开发环境的IP地址。从而模拟真实环境中的域名访问&#xff0c;方便调试和开发。 步骤 1、以管理员身份打开命令提示符 2、编辑hosts文件&#xff1a; 输入以下命令打开hosts文…...

Spring Boot 全面解析:从入门到实践案例

引言&#xff1a; Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;旨在简化 Spring 应用的初始搭建以及开发过程。它基于 Spring 平台&#xff0c;通过“约定优于配置”的原则&#xff0c;尽可能自动化配置&#xff0c;减少XML配置&#xff0c;使得开发者能够快速启…...

222222222

2222222...

Boost 智能指针

scoped_ptr 不能被复制或赋值给其他 scoped_ptr 对象&#xff0c;不能与其他指针比较 (除了 nullptr) scoped_ptr 用例 template <typename T> class scoped_ptr { public:// 构造函数&#xff1a;初始化 scoped_ptr 并接管指针的所有权explicit scoped_ptr(T* ptr n…...

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中&#xff0c;默认情况下 root 用户是禁用 SSH 登录的&#xff0c;这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置项。默认情况下&#xff0c;它通常被设置为 PermitRootLogin prohibit-password 或…...

C语⾔数据类型和变量

C语⾔数据类型和变量 1.数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符&#…...

运行时类型信息(RTTI)

在计算机编程中,运行时类型信息(Runtime Type Information,简称RTTI)或运行时类型标识(Runtime Type Identification)是某些编程语言(如C++、Object Pascal、Ada)的一个特性,它允许在程序运行时获取对象的数据类型信息。RTTI可以用于所有类型,也只能用于显式启用RTTI…...

使用 NVivo 定性数据分析软件指导癌症护理研究

您是否曾因进行全面文献综述所需的大量研究而感到不知所措&#xff1f;在比较和整理大量冗长的出版物时&#xff0c;您是否不知道从哪里开始&#xff1f;幸运的是&#xff0c;这正是定性研究专家 Heidi Rishel Brakey 硕士擅长的领域&#xff0c;我们将在本案例研究中介绍这一点…...

R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性

原文链接&#xff1a;使用ggplot绘制柱状图&#xff0c;在柱子中显示数值和显著性 本期教程 获得本期教程示例数据&#xff0c;后台回复关键词&#xff1a;20240628。&#xff08;PS&#xff1a;在社群中&#xff0c;可获得往期和未来教程所有数据和代码&#xff09; 往期教程…...

第十四届蓝桥杯省赛C++B组D题【飞机降落】题解(AC)

解题思路 这道题目要求我们判断给定的飞机是否都能在它们的油料耗尽之前降落。为了寻找是否存在合法的降落序列&#xff0c;我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方法&#xff0c;尝试所有可能的降落顺序。 首先&#xff0c;我们需要理解题目中的条件。每架…...

容器化spring boot应用程序

容器化spring boot应用程序有多种方式&#xff0c;如基于简单的Dockerfile&#xff0c;多阶段Dockerfile以及基于Docker Compose等&#xff0c;我们将逐步给大家介绍&#xff0c;本节主要介绍基于简单的Dockerfile进行容器化spring boot的应用程序。 创建Spring boot应用程序 …...

掌握智慧校园:资产来源功能解析

在智慧校园的资产管理框架下&#xff0c;资产来源管理是确保资产数据完整性和合规性的重要一环。这一功能通过数字化手段&#xff0c;详尽记录每一项资产从何而来&#xff0c;无论是采购、捐赠、内部调拨&#xff0c;还是自制与改造&#xff0c;均需经过严格记录与追踪&#xf…...

基于公有云部署wordpress

云平台选择 腾讯云 阿里云 华为云 项目部署 一、架构讲解 1.1、定义与组成 LNMP是Linux、Nginx、MySQL&#xff08;或MariaDB&#xff09;和PHP&#xff08;或Perl、Python&#xff09;的首字母缩写&#xff0c;代表在Linux系统下使用Nginx作为Web服务器&#xff0c;MySQL作为…...

vite+vue集成cesium

1、创建项目、选择框架vuejs pnpm create vite demo_cesium 2、进入项目安装依赖 cd demo_cesium pnpm install3、安装cesium及插件 3、pnpm i cesium vite-plugin-cesium 4、修改vite-config.js import { defineConfig } from vite import vue from vitejs/plugin-vue impo…...

2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文

2024 年江西省研究生数学建模竞赛题目交通信号灯管理 1 题目 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、 黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通 信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。 一…...

华为机试HJ1字符串最后一个单词的长度

华为机试HJ1字符串最后一个单词的长度 题目&#xff1a; 计算字符串中最后一个单词的长度 想法&#xff1a; 利用空格将字符串中的单词进行切分&#xff0c;返回最后一个单词的长度 input_str input() # 字符串输入 result input_str.split(" ")[-1] # 选取…...

排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 排序是一种基本的数据处理操作&#xff0c;它涉及将一系列项目重新排列&#xff0c;以便按照指定的标准&#xff08;通常是数值大小&#xff09;进行排序。在C语言中&#xff0c;排序算法是用来对元素进行排序的一系…...

(2024)docker-compose实战 (6)部署前端项目(react, vue)

前言 本次仅使用nginx搭建单一的前端项目, 前端项目可以是html, react, vue.项目目录中需要携带nginx的配置文件(conf/default.conf).前端文件直接拷贝到项目目录中即可.如果不确定镜像的配置文件目录, 可以通过 docker inspect 镜像名 来查看具体的配置信息.使用docker-compos…...

python 中的 下划线_ 是啥意思

在 Python 中&#xff0c;_&#xff08;下划线&#xff09;通常用作占位符&#xff0c;表示一个变量名&#xff0c;但程序中不会实际使用这个变量的值。 目录 忽略循环变量&#xff1a;忽略函数返回值&#xff1a;在解释器中使用&#xff1a;举例子1. 忽略循环变量2. 忽略不需…...

Solana公链

Solana是一个高性能的区块链平台&#xff0c;其设计目标是在不牺牲去中心化或安全性的情况下提供可扩展性。Solana由前高通、英特尔及Dropbox的工程师于2017年末创立。以下是Solana的一些关键特点&#xff1a; 高吞吐量&#xff1a;Solana能够每秒处理高达65,000笔交易&#xf…...

【LeetCode】反转字符串中的单词

目录 一、题目二、解法完整代码 一、题目 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1…...

[leetcode]文件组合

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> fileCombination(int target) {vector<vector<int>> vec;vector<int> res;int sum 0, limit (target - 1) / 2; // (target - 1) / 2 等效于 target /…...

数据库断言

预期值和实际值做对比 步骤&#xff1a; 1、得到表格数据 2、接口断言预期值与实际值做对比 读取表格数据-得到接口地址&#xff08;address)和是否接口db检查(dbcheck)&#xff0c;并且这条数据是有效的(vaild) 有2条用例&#xff0c;也会有三个条件不全部满足的情况&…...

uniapp+nodejs实现小程序支付

1.准备商户号、企业级小程序(或者个体工商户级别的) 2.在小程序端调用uni.login获取code&#xff0c;传递给后端 uni.login({success: loginRes > {uni.request({url: "http://127.0.0.1:3003/wxpay/pay",data: {code: loginRes.code},method: "get",…...

SolidityFoundry 安全审计测试 memory滥用

名称&#xff1a; memory滥用 https://github.com/XuHugo/solidityproject/tree/master/vulnerable-defi 描述&#xff1a; 在合约函数中滥用storage和memory。 memory是一个关键字&#xff0c;用于临时存储执行合约所需的数据。它保存函数的参数数据&#xff0c;并在执行后…...

面试题--SpringBoot

SpringBoot SpringBoot 是什么(了解) 是 Spring 的子项目,主要简化 Spring 开发难度,去掉了繁重配置,提供各种启动器,可以 让程序员很快上手,节省开发时间. SpringBoot 的优点(必会) SpringBoot 对上述 Spring 的缺点进行的改善和优化&#xff0c;基于约定优于配置的思想&am…...