每日一抄 Go语言使用通道响应计时器事件

package main

import (
	"fmt"
	"time"
)

/*
Go语言中,time包提供了计时器的封装。由于Go语言中的通道和goroutine的设计,定时任务可以在goroutine
中通过同步的方式完成,也可以通过在goroutine中异步回调完成,这里将展示这两个方法
*/

//一段时间之后 (time.After)
//延迟回调

func main() {
	//声明一个退出用的通道
	exit := make(chan int)

	//打印开始
	fmt.Println("start")

	//过一秒后调用匿名函数
	//传入等待的时间和一个回调,回调使用一个匿名函数,在时间到达后,匿名函数会在另一个goroutine中被调用
	time.AfterFunc(time.Second, func() {
		//一秒后打印结果
		fmt.Println("这就是打印的结果")
		//通知main的goroutine已经结束
		//这里往通道中写入,代表需要退出。
		exit <- 0
	})
	
	//这里很重要,代表main的goroutine被阻塞(因为此时通道中是没有值可以拿出来的),要等待一秒后
	//第三十行被执行,exit通道中有数据后才能继续执行
	<-exit

}

time.AfterFunc() 函数是在 time.After 基础上增加了到时的回调,方便使用。

而 time.After() 函数又是在 time.NewTimer() 函数上进行的封装,下面的例子展示如何使用 timer.NewTimer() 和 time.NewTicker()。

package main

import (
	"fmt"
	"time"
)

/*
计时器(Timer)的原理和倒计时钟类似,都是给定多少时间后触发。打点器(Ticker)的原理和钟表类似,钟表每到整点就会触发
这两种方法创建后会返回time.Ticker对象和time.Timer对象,里面通过一个C成员,类型是只能接收时间通道(<- chan Time)
使用这个通道就可获得时间触发的通知
*/

//下面代码创建一个打点器。每500ms触发一起;创建一个计时器2s后触发,只触发一次

//计时器

func main() {
	//创建一个打点器每500ms触发一次
	ticker := time.NewTicker(time.Millisecond * 500)

	//创建一个计时器,2s后触发
	stopper := time.NewTimer(time.Second * 2)

	//声明计数变量
	var i int

	//不断检查通道情况
	for {
		//Multiplex chan
		select {
		//计时器触发
		case <-stopper.C:
			fmt.Println("stop")
			//跳出循环
			goto StopHere
		//打点器触发
		case <-ticker.C:
			//记录触发了多少次
			i++
			fmt.Println("tick", i)
		}

	}
	//退出的标签,使用goto跳转
StopHere:
	fmt.Println("done")
}

/*
type Timer struct {
	C <-chan Time
	r runtimeTimer
}
*/
posted @   蹇爱黄  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示