Golang编程语言知识介绍


  • 首页

  • todo

  • 思考

  • life

  • food

  • OS

  • lua

  • redis

  • Golang

  • C

  • TCP/IP

  • ebpf

  • p4

  • OpenVPN

  • IPSec

  • L2TP

  • DNS

  • distributed

  • web

  • OpenWRT

  • 运维

  • Git

  • 鸟哥的私房菜

  • IT杂谈

  • 投资

  • About Me

  • 友情链接

  • FTP

  • 搜索
close

go 定时器 ticker和timer

时间: 2021-04-03   |   分类: go     |   阅读: 327 字 ~1分钟

原文链接

两种类型的定时器:ticker和timer。两者有什么区别呢?请看如下代码:

ticker

package main
 
import (
        "fmt"
        "time"
)
 
func main() {
        d := time.Duration(time.Second*2)
        t := time.NewTicker(d)
        defer t.Stop()
 
        for {
                <- t.C
                fmt.Println("timeout...")
        }
}

timeout… timeout… timeout…

解析

ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。

timer

package main

import (
       "fmt"
       "time"
)


func main() {

       d := time.Duration(time.Second*2)
       t := time.NewTimer(d)
       defer t.Stop()

       for {
           <- t.C
           fmt.Println("timeout...")
   	    // need reset
   	    t.Reset(time.Second*2)
       }
}

output:

timeout… timeout… timeout…

解析

使用timer定时器,超时后需要重置,才能继续触发。

 

如果callback中有sleep操作,那么ticker也不会在sleep期间发送多个timeout_signal,可以认为用了一个容量为1的channel

实操如下

d := time.Duration(time.Second * 1)
t := time.NewTicker(d)
defer t.Stop()
log.Println("timeout...")
time.Sleep(10 * time.Second)
 
for {
	<-t.C
	log.Println("timeout...")
}

15:12:44 timeout… 15:12:54 timeout… 15:12:55 timeout…

#go#
深入 Go Golang 内存分配超级棒的文章:Go 内存分配器可视化指南
go 使用protobuf
shankusu2017@gmail.com

shankusu2017@gmail.com

日志
分类
标签
GitHub
© 2009 - 2025
粤ICP备2021068940号-1 粤公网安备44011302003059
0%