当前位置: 代码网 > it编程>前端脚本>Golang > go语言中Timer和Ticker两种计时器的使用

go语言中Timer和Ticker两种计时器的使用

2024年09月08日 Golang 我要评论
介绍go语言中有timer和ticker这样的两种计时器,两种计时器分别实现了不同的计时功能。timer是单次时间事件,指在指定的单次时间过后触发,然后向自己channel中发送当时时间,此后time

介绍

go语言中有timer和ticker这样的两种计时器,两种计时器分别实现了不同的计时功能。

  • timer是单次时间事件,指在指定的单次时间过后触发,然后向自己channel中发送当时时间,此后timer不再计时。
  • ticker是多次时间事件,指每隔一段事件都触发一次,并向自己channel发送当前时间。
  • 类似于javascript中的settimeout()和setinterval()两种计时器。

timer计时及其方法

type timer struct {
    c <-chan time
    // 内含隐藏或非导出字段
}

timer类型代表单次时间事件。当timer到期时,当时的时间会被发送给c。

newtimer

func newtimer(d duration) *timer

newtimer创建一个timer,它会在最少过去时间段d后到期,向其自身的c字段发送当时的时间。

使用:

package main

import (
	"fmt"
	"time"
)
func main() {
	timer := time.newtimer(10 * time.second)

	t1 := time.now()
	fmt.printf("t1:%v\n", t1)
	t2 := <-timer.c
	fmt.printf("t2:%v\n", t2)
}

输出:

t1:2023-04-29 22:13:20.3142549 +0800 cst m=+0.002562901
t2:2023-04-29 22:13:30.328093 +0800 cst m=+10.016401001

程序输出t1后,又计时了10秒输出了t2

stop

func (t *timer) stop() bool

stop停止timer的执行。如果停止了t会返回真;如果t已经被停止或者过期了会返回假。stop不会关闭通道t.c,以避免从该通道的读取不正确的成功。

使用:

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.newtimer(10 * time.second)

	t1 := time.now()
	fmt.printf("t1:%v\n", t1)
	//停止计时器
	timer.stop()
	t2 := time.now()
	fmt.printf("t2:%v\n", t2)
	t3 := <-timer.c
	fmt.printf("t3:%v\n", t3)
}

输出:

t1:2023-04-29 22:25:05.921852 +0800 cst m=+0.002725901
t2:2023-04-29 22:25:05.9372012 +0800 cst m=+0.018075101
fatal error: all goroutines are asleep - deadlock! 

可见,程序在timer使用了stop方法以后输出t3就报出了all goroutines are asleep - deadlock! 错误。

reset

func (t *timer) reset(d duration) bool

reset使t重新开始计时,(本方法返回后再)等待时间段d过去后到期。如果调用时t还在等待中会返回真;如果t已经到期或者被停止了会返回假。

使用:

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.newtimer(10 * time.second)

	t1 := time.now()
	fmt.printf("t1:%v\n", t1)
	//程序休眠2s
	time.sleep(2 * time.second)
	//重新设置时间间隔
	timer.reset(15 * time.second)
	t2 := time.now()
	fmt.printf("t2:%v\n", t2)
	t3 := <-timer.c
	fmt.printf("t3:%v\n", t3)
}

输出:

t1:2023-04-29 22:33:53.4179209 +0800 cst m=+0.002563001
t2:2023-04-29 22:33:55.4452012 +0800 cst m=+2.029843301
t3:2023-04-29 22:34:10.4605181 +0800 cst m=+17.045160201

计时器被重新设置后会根据设置的时间段重新计时,到时间后,计时结束,向其自身的c字段发送当时的时间。

ticker计时及其方法

type ticker struct {
c <-chan time // 周期性传递时间信息的通道
// 内含隐藏或非导出字段
}

ticker保管一个通道,并每隔一段时间向其传递"tick"。

newticker

func newticker(d duration) *ticker

newticker返回一个新的ticker,该ticker包含一个通道字段,并会每隔时间段d就向该通道发送当时的时间。它会调整时间间隔或者丢弃tick信息以适应反应慢的接收者。如果d<=0会panic。关闭该ticker可以释放相关资源。

func (t *ticker) stop()

stop关闭一个ticker。在关闭后,将不会发送更多的tick信息。stop不会关闭通道t.c,以避免从该通道的读取不正确的成功。

使用:

package main

import (
	"fmt"
	"time"
)

func main() {
	ticker := time.newticker(1 * time.second)
	a := 10
	for {
		<-ticker.c
		fmt.println("a:", a)
		a--
		if a == 0 {
			ticker.stop()
			break
		}
	}
}

输出;

i: 10
i: 9
i: 8
i: 7
i: 6
i: 5
i: 4
i: 3
i: 2
i: 1

可见,程序中,每隔设置的1s时间就触发一次定时器,并且向自带的channel c中传递当时时间。

到此这篇关于go语言中timer和ticker两种计时器的使用的文章就介绍到这了,更多相关go语言 timer和ticker内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com