我有一个资源需要在允许任何访问之前加载。它还需要每分钟更新一次。
通道长度为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
}
}
}()
}
我想你只是在有新数据的时候发布到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{}{}
}
}