为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 for 循环中没有默认的情况下使选择案例非阻塞

如何在 for 循环中没有默认的情况下使选择案例非阻塞

Go
明月笑刀无情 2022-09-05 17:54:23
我有这段代码。func Start() bool {    for {        if checkSomthingIsTrue() {            if err := doSomthing(); err != nil {                continue            }        }        select {        case <-ctx.Done():            return true        }    }}如何在不使用的情况下使上述功能不阻塞。不使用默认情况的原因是因为它总是消耗100%的CPU。default:答:我已经用了时间。股票代码节流 谢谢
查看完整描述

1 回答

?
qq_笑_17

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


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信