我有一个资源,需要允许任何访问后才能加载。还需要每分钟更新一次。
通道的长度为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
}
}
}()
}
答案 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{}{}
}
}