gpt4 book ai didi

Golang for select 循环消耗 100% 的 cpu

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:24 24 4
gpt4 key购买 nike

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

channel 的长度为 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
}
}
}()
}

最佳答案

default 语句创建一个导致 100% cpu 使用的非阻塞无限循环。当不满足 case 的条件时,循环进入默认的非阻塞无限循环。

删除 default 将解决问题。但是会有一个 linter 警告 S1000: should use for range instead of { select {} } 以告知 select 对于单 channel 毫无意义。

最终代码将是

for {
_ := <-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)
}
}

关于Golang for select 循环消耗 100% 的 cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55367231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com