选择循环的Golang消耗了100%的CPU

时间:2019-03-26 22:43:43

标签: go cpu

我有一个资源,需要允许任何访问后才能加载。还需要每分钟更新一次。

通道的长度为struct {},因此如果资源尚未加载,则循环将被阻塞。

下面的代码开始使用100%的CPU,我尝试添加

time.Sleep(10 * time.Millisecond)

这使应用程序的cpu消耗下降到了1%

我认为对于定时收集,股票报价是一个更好的选择。

有什么想法为什么会消耗100%的cpu或任何更好的实现想法?

func (al *AsyncLoop) Run() {
    go func() {
        for {
            select {
            case <-al.chanFetchRequest:
                if al.fetched == false {
                    al.fetchData()
                } else if al.lastUpdated.Add(1*time.Minute).Unix() < time.Now().Unix() && al.fetching == false {
                    go al.fetchData()
                }
                al.chanFetchResponse <- struct{}{}
                continue
            default:
                continue
            }
        }
    }()
}

1 个答案:

答案 0 :(得分:0)

我认为您只有在有新数据时才将其发布到al.chanFetchRequest,因此我认为您必须一直从该频道进行读取。在选择中添加股票代号可能会导致您获取数据,即使数据没有更改或在加载之前(较差)也是如此。在正常情况下,为什么不花时间在每次获取数据时,然后下次确保在再次获取之前已经等待了足够的时间。像这样:

        var nextFetch time.Time
        for {
            select {
            case <-al.chanFetchRequest:
                if al.fetched == false {
                    al.fetchData()
                    nextFetch = time.Now().Add(1 * time.Minute)
                } else if time.Now().After(nextFetch) {
                    al.fetchData()
                    nextFetch = time.Now().Add(1 * time.Minute)
                }
                al.chanFetchResponse <- struct{}{}
            }
        }