Go并发编程(八)go定时器

Go并发编程(八)go定时器

Go的标准包time里提供了两种定时器,一种是标准定时器,另一种是循环定时器。

标准定时器timer

timer在到达指定时间时仅仅触发一次,当timer到期时会将当前时间发送到自己的C管道,timer实例必须通过NewTimer或AfterFunc

	timer := time.NewTimer(time.Second * 3)

延迟执行:

第一种实现

time.sleep(3 * time.Second)

使用After模拟超时:After到达指定时间后会向内置C管道发送当前时间

func TestMyTime()  {
	c := make(chan struct{})

	go func() {
		time.Sleep(3 * time.Second)
		<- c
	}()
	// select case可以是发送可以是接收
	select {
	case c <- struct{}{}:fmt.Println("channel")
	case <- time.After(5 * time.Second):fmt.Println("超时啦")
		close(c)
	}
}

第二种实现:使用AfterFunc,返回timer对象,可用来关闭定时器

func TestTimeAfterFunc()  {
	c := make(chan struct{})
	timer := time.AfterFunc(3 * time.Second, func() {
		fmt.Println("经过3秒后执行该函数")
		c <- struct{}{}
	})
	<- c
	timer.Stop()
}

循环定时器Tick

time包中的循环定时器都是永久执行的定时器,直到手动关闭它。time中没有可以指定次数的循环定时器。会根据时间频率不断发送时间到返回的管道

func TestTick()  {
	ticker := time.NewTicker(time.Second * 1)
	wg := sync.WaitGroup{}

	wg.Add(10)
	for t := range ticker.C {
		fmt.Printf("Backup at %s\n", t)
		wg.Done()
	}
	wg.Wait()
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值