1 回答
TA贡献1818条经验 获得超7个赞
这里有一个根本性的误解。线程只能执行两项操作:
线程可以阻塞,等待某些东西。
线程可以使用 CPU 运行。
如果线程从不阻塞,则它使用 100% 的可用 CPU。不能使非阻塞代码使用的 CPU 少于 100%。
您有三种选择:
使用非阻塞代码,并接受 100% 的 CPU 使用率。
重新设计,使其使用通道,并且可以放在块内。checkSomthingIsTrue()select
for {
select {
case <-ctx.Done():
return true
case <-whenSomethingIsTrue():
if err := doSomthing(); err != nil {
continue
}
}
}
使用超时来限制循环,例如:
// Poll every 100ms.
const pollInterval = 100 * time.Millisecond
for {
select {
case <-ctx.Done():
return true
case <-time.After(pollInterval):
if checkSomthingIsTrue() {
if err := doSomthing(); err != nil {
continue
}
}
}
}
另请注意,这毫无意义,但这是一个不同的问题。continue
- 1 回答
- 0 关注
- 63 浏览
添加回答
举报