Go教程

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

本文主要是介绍Go并发编程(八)go定时器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • Go并发编程(八)go定时器
    • 标准定时器timer
    • 循环定时器Tick

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()
}
这篇关于Go并发编程(八)go定时器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!