Go 定时器和断续器

1、定时器

Go语言中定时器可以实现在指定时间点执行特定的事件,定时器的实质是单向通道,time.Timer结构体类型中有一个time.Time类型的单向chan,具体声明如下:

type Timer struct {
    C <-chan Time
    r runtimeTimer
}

只能通过两种方式来进行初始化:time.NewTimer()和time.AfterFunc(),看如下代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    // NewTimer方法接受一个时间段d表示自此刻起经历d时间段后,定时器到期;返回值为*Timer类型,到期后将到期时的时间写入*Timer的C(chan time.Time)字段中
    t := time.NewTimer(2 * time.Second)
    now := time.Now()
    fmt.Printf("Now time: %v\n", now)
    // 改行代码会阻塞当前的goroutine,直到t.C中传入一个元素
    expire := <-t.C
    fmt.Printf("Expire time: %v\n", expire)
}
package main

import (
    "fmt"
    "time"
)

func main() {
    var t *time.Timer
    f := func() {
        fmt.Printf("Expriation time: %v\n", time.Now())
        fmt.Printf("C`s length: %v\n", len(t.C))
    }
    // 在定时器过期时执行一个自定义的无接受参数和输出参数的函数
    t = time.AfterFunc(1*time.Second, f)
    // 为了结果输出完全
    time.Sleep(2 * time.Second)
}

如果不使用时器的Stop()和Reset()方法,可以直接用定时器的快捷方法,如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Printf("Now time:%v\n", time.Now())
    c := <-time.After(5 * time.Second)
    fmt.Printf("TimeOut. Now :%v\n", c)
}

如果在定时器到期之前,使用Stop(),那么就不会再有元素写入通道内,那么等待接受该通道元素所在的goroutine将被阻塞,恢复被停止的定时器的唯一途径是使用Reset()方法重置;定时器可以复用,尤其是在for循环中复用可以减少程序的资源占用,这时需要Reset()方法来重置定时器。

2、断续器

Go提供了循环多次的执行某一任务的工具,续断器,实质是单向通道,time.结构体类型中有一个time.Time类型的单向chan,具体声明如下:

type Ticker struct {
    C <-chan Time 
    r runtimeTimer
}

续断器使用NewTicker()来初始化,代码如下:

package main

import (
    "fmt"
    "time"
)

func main() {
    ticks := time.NewTicker(30 * time.Second)
    tick := ticks.C
    go func() {
        // for...range...相当于从通道取一个元素
        for _ = range tick {
            fmt.Printf("%vExecute the task.\n", time.Now())
            // 再次执行接受操作时,由于通道内暂时没有值,就会被阻塞,直到下次触发到期
            _, ok := <-tick
            if !ok {
                break
            }
        }
    }()
    fmt.Printf("Now: %v.\n", time.Now())
    time.Sleep(5 * time.Minute)
    fmt.Println("Done.")
}

如果不使用续断器的Stop()方法,可以直接使用续断器的快捷方法,如下

tick := <-time.Tick(5 * time.Second)
时间: 2024-10-11 08:37:31

Go 定时器和断续器的相关文章

Unity中的定时器与延时器

JavaScript中的定时器与延时器,分别是 setInterval.setTimeout,对应的清理函数是:clearInterval.clearTimeout. 而在Unity中,则分别是:Invoke.InvokeRepeating和取消延迟调用  CancelInvoke 延迟调用 void Invoke(string methodName, float time): 重复延迟调用 void InvokeRepeating(string methodName, float time,

全球与中国断续器市场现状及未来发展趋势

本报告研究全球与中国市场断续器的发展现状及未来发展趋势,分别从生产和消费的角度分析断续器的主要生产地区.主要消费地区以及主要的生产商.重点分析全球与中国市场的主要厂商产品特点.产品规格.不同规格产品的价格.产量.产值及全球和中国市场主要生产商的市场份额. 主要生产商包括: Sharp Omron Rohm Semiconductor TT Electronics Vishay Intertechnology Panasonic Honeywell On Semiconductor OSRAM L

定时器和延时器(利用定时器制作倒计时)

一.延时器(setTimeout) 1.延时器(setTimeout)的工作方式是:当设定一个延时器是5s后进行时,并不代表它5s后就立即执行,只是代表它5s后会被加入队列,如果5s后,队列没有其他东西,那么延时器的代码会立即执行,否则会延迟执行. 因此,关于延时器最重要的一点是:指定的时间间隔(如设置5s后执行),表示何时将延时器加入到队列,而不是何时真正执行代码. 二.定时器(setInterval) 1.定时器的一大特点是每隔一段时间(如每隔2s)就会执行,一直重复.这样有个问题:设定一个

JS 定时器与延时器

avaScript里面内置了两个定时器,一个是setTimeout()一个是setInterval().下面将由浅入深来理解一下定时器的工作原理. 使用方式: setTimeout() function out(){ alert("定时器"); }; var timeoutID = window.setTimeout(out,10000); setTimeout 的语法非常简单,第一个参数为回调函数,第二个参数为延时的时间.函数返回一个数值类型的ID唯一标示符,此ID可以用作 clea

js定时器 倒时器

setInterval("fun()",1000) setInterval(fun, 1000);每隔1秒钟,就去执行一次 fun 这个函数(最常用) setInterval( function(){} , 1000 ) setInterval(fun(),1000)  错误的 倒计时:<!DOCTYPE html><html> <head>  <meta charset="UTF-8">  <title>

cocos2d-x调度器原理

程序运行后每达到一帧的时间间隔就会执行一次mainLoop void CCDisplayLinkDirector::mainLoop(void) { //判断是否需要释放CCDirector,通常游戏结束才会执行这个步骤 if (m_bPurgeDirecotorInNextLoop) { m_bPurgeDirecotorInNextLoop = false; purgeDirector(); } else if (! m_bInvalid) { //绘制当前场景并执行其他必要的处理 draw

web前端技术回顾

短暂的前端学习结束了,系统的接受了html+css+JavaScript+jQuery+Bootstrap.东西很多很系统.现在就来回顾下之前的学习内容.HTML让我认识到了网页的基本构成主要是由: <html> <head></head> <body></body> </html>这三部分组成,head里面可以放<title></title>标签,<title>的主要作用是可以在网页运行中把你的网

AS3的垃圾回收与内存管理

GC 和内存泄露无关 垃圾回收,这次是一个被无数人讨论过的传统话题. Action Script 使用的是和 Java 相似的内存管理机制,并不会即时回收废弃对象的内存,而是在特定时间统一执行一次 GC(Gabage Collection)操作来释放废弃对象的内存,避免了重复判断是否需要回收产生的性能问题. 但要注意,这只是决定回收的时机,而不是回收的内容.这个延迟执行内存回收也就是个表面的现象,不管什么时候执行 GC,能够回收的内存最终都能回收,不能回收的肯定不能回收.唯一的影响是,因为回收是

高可靠对称节点(双星模式)

高可靠对称节点(双星模式) 概览 双星模式是一对具有主从机制的高可靠节点.任一时间,某个节点会充当主机,接收所有客户端的请求:另一个则作为一种备机存在.两个节点会互相监控对方,当主机从网络中消失时,备机会替代主机的位置. 双星模式由Pieter Hintjens和Martin Sustrik设计,应用在iMatix的OpenAMQ服务器中.它的设计理念是: 提供一种简明的高可靠性解决方案: 易于理解和使用: 能够进行可靠的故障切换. 假设我们有一组双星模式的服务器,以下是可能发生的故障: 主机发