【发布时间】:2019-03-26 22:43:43
【问题描述】:
我有一个资源需要先加载,然后才能对其进行任何访问。它也需要每分钟更新一次。
通道的长度为 1 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
}
}
}()
}
【问题讨论】:
-
您的选择中有一个默认情况,这意味着如果从
al.al.chanFetchRequest中没有可读取的内容,for 循环将旋转。 -
同时查看
al.lastUpdated、scp.fetching和go al.fetchData()也有可能在此代码中存在数据竞争。 -
是的,感谢您发现这一点,我将添加一些带有互斥锁的 get 和 set 方法