带有 Ticker 的 Goroutine 选择循环导致 CPU 达到 100%

我有这个循环,它的作用是尝试反复轮询另一台服务器。我使用ticker来实现这一点,但是程序反复显示100%的CPU使用率。


这个代码在一个 goroutine 中运行。HTTP 服务器在另一个 goroutine 中运行。



func() Monitor() {


  abort := make(chan bool)


  log.Info("Monitor started.")


  // start the monitor goroutine

  go func() {

      defer log.Info("Stopped monitor")

        

      ticker := time.NewTicker(time.Duration(35.0) * time.Second)

      defer ticker.Stop()

        

      log.Info("Monitor started! \n")

      for {

        select {

        case t := <-ticker.C:

            log.Infof("Subscribe to service at time %v\n", t)

            if err := selfConn.SubscribeToService(); err != nil {

                log.Errorf("Failed to subscribe to primary connector: %v", err)

            } 

        case <-abort:

            log.Info("Finished routine!")

            return

        default:

            continue

        }

        }

    }() 

  

    go func() {

        time.Sleep(10 * time.Minute)

        abort <- true

    }()

}

但是,当监视器循环开始时,每次发送到股票通道的信号时,CPU 都会持续显示 100%。


在 goroutine 中使用 ticker 以使其不会消耗 100% CPU,我错过了什么?


开满天机
浏览 133回答 1
1回答

子衿沉夜

你的循环中select有一个default分支。如果其他cases 都没有准备好继续,default则立即执行分支,因此您的下一次迭代立即开始而无需等待。这是一个繁忙的循环。此外,不需要另一个 goroutine 终止,您可以在同一个 goroutine 中使用计时器。例如:func monitor() {&nbsp; &nbsp; log.Info("Monitor started.")&nbsp; &nbsp; ticker := time.NewTicker(35 * time.Second)&nbsp; &nbsp; defer ticker.Stop()&nbsp; &nbsp; timeoutCh := time.After(10 * time.Minute)&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case t := <-ticker.C:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Infof("Subscribe to service at time %v\n", t)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err := selfConn.SubscribeToService(); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Errorf("Failed to subscribe to primary connector: %v", err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; case <-timeoutCh:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; log.Info("Finished routine!")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go