亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 94 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號