猿问

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

我有这段代码。


func Start() bool {

    for {

        if checkSomthingIsTrue() {

            if err := doSomthing(); err != nil {

                continue

            }

        }

        select {

        case <-ctx.Done():

            return true

        }

    }

}

如何在不使用的情况下使上述功能不阻塞。不使用默认情况的原因是因为它总是消耗100%的CPU。default:


答:我已经用了时间。股票代码节流 谢谢


明月笑刀无情
浏览 64回答 1
1回答

qq_笑_17

这里有一个根本性的误解。线程只能执行两项操作:线程可以阻塞,等待某些东西。线程可以使用 CPU&nbsp;运行。如果线程从不阻塞,则它使用 100% 的可用 CPU。不能使非阻塞代码使用的 CPU 少于 100%。您有三种选择:使用非阻塞代码,并接受 100% 的 CPU 使用率。重新设计,使其使用通道,并且可以放在块内。checkSomthingIsTrue()selectfor {&nbsp; &nbsp; select {&nbsp; &nbsp; case <-ctx.Done():&nbsp; &nbsp; &nbsp; &nbsp; return true&nbsp; &nbsp; case <-whenSomethingIsTrue():&nbsp; &nbsp; &nbsp; &nbsp; if err := doSomthing(); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}使用超时来限制循环,例如:// Poll every 100ms.const pollInterval = 100 * time.Millisecondfor {&nbsp; &nbsp; select {&nbsp; &nbsp; case <-ctx.Done():&nbsp; &nbsp; &nbsp; &nbsp; return true&nbsp; &nbsp; case <-time.After(pollInterval):&nbsp; &nbsp; &nbsp; &nbsp; if checkSomthingIsTrue() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err := doSomthing(); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}另请注意,这毫无意义,但这是一个不同的问题。continue
随时随地看视频慕课网APP

相关分类

Go
我要回答