Golang for select循环消耗100%的cpu

问题描述 投票:-1回答:1

我有一个资源需要在允许任何访问之前加载。它还需要每分钟更新一次。

通道长度为1 struct {},因此如果尚未加载资源,则会阻止循环。

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

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
            }
        }
    }()
}
go cpu
1个回答
0
投票

我想你只是在有新数据的时候发布到al.chanFetchRequest,所以我认为你必须一直继续读取这个频道。向select中添加一个自动收录器可能会导致您获取数据,即使它没有更改,也可能(甚至在加载之前)更糟糕。在正常情况下,为什么不在每次获取数据时花时间,然后下次确保在再次获取之前等待足够的时间。像这样的东西:

        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{}{}
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.