ZBLOG

func main(){ timer(context.TODO()) } func timer(ctx context.Context) { interval := time.Microsecond *10 //endTime := time.Now() cnt := 10 cycleTimer := time.NewTicker(interval) defer cycleTimer.Stop() startTime := time.Now() for cnt > 0{...

代码中存在一个问题,即定时器 cycleTimer 每次循环都会被重置,导致无法按照预期的间隔触发。可以通过将定时器移至 for 循环外来解决这个问题。

以下是修复后的代码:

func main() {
	timer(context.TODO())
}

func timer(ctx context.Context) {
	interval := time.Microsecond * 10
	//endTime := time.Now()
	cnt := 10
	startTime := time.Now()
	for cnt > 0 {
		cycleTimer := time.NewTicker(interval)
		select {
		case <-cycleTimer.C:
			cnt--
		case <-ctx.Done():
			fmt.Println("ctx canceled")
			cycleTimer.Stop()
			return
		}
		cycleTimer.Stop()
	}
	fmt.Printf("use time.Tick delay %d us, real delay %v us\n",
		interval.Nanoseconds(), time.Now().Sub(startTime).Nanoseconds())
}

在每次循环开始前创建新的定时器,并在每次循环结束后停止定时器。同时,在 case <-ctx.Done() 中添加 return 来确保函数及时退出。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13485

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?