登录
首页 >  Golang >  Go问答

使用循环处理 Goroutine 中的 Ticker 导致 CPU 利用率飙升至 100%

来源:stackoverflow

时间:2024-03-04 16:27:25 311浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《使用循环处理 Goroutine 中的 Ticker 导致 CPU 利用率飙升至 100%》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我有一个循环,它的作用是尝试重复轮询另一台服务器。我使用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 时我错过了什么?


解决方案


您的循环内有一个带有 default 分支的 select。如果其他 case 都没有准备好继续,则 default 分支将立即执行,因此您的下一次迭代将立即开始,无需等待。这是一个繁忙的循环。

此外,不需要另一个 goroutine 终止,您可以在同一个 goroutine 中使用计时器。

例如:

func monitor() {
    log.Info("Monitor started.")

    ticker := time.NewTicker(35 * time.Second)
    defer ticker.Stop()

    timeoutCh := time.After(10 * time.Minute)
    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 <-timeoutCh:
            log.Info("Finished routine!")
            return
        }
    }
}

今天关于《使用循环处理 Goroutine 中的 Ticker 导致 CPU 利用率飙升至 100%》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>