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

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

即使經過很短的時間,Go 程序也會永遠休眠。

即使經過很短的時間,Go 程序也會永遠休眠。

Go
森欄 2023-07-17 15:15:02
我正在嘗試在 Go 中構建一些缺少的信號量。盡管當通道接收到信號時它就會永遠休眠。我嘗試過改變睡眠方式和睡眠時間,但它仍然永遠停止。這是我嘗試過的表示:func main() {    backOffChan := make(chan struct{})    go func() {        time.Sleep(2)        backOffChan <- struct{}{}    }()    for {        select {        case <-backOffChan:            d := time.Duration(5 * time.Second)            log.Println("reconnecting in %s", d)            select {            case <-time.After(d):                log.Println("reconnected after %s", d)                return            }        default:        }    }}我希望它在打印日志消息并返回后返回。
查看完整描述

1 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

這段代碼有很多問題,主要是使用for/的緊密循環select可能不允許其他 goroutine 在通道上發送。由于default箱子是空的并且select只有一個,因此不需要case整個箱子。select以下代碼可以正確運行:


backOffChan := make(chan struct{})

go func() {

    time.Sleep(1 * time.Millisecond)

    backOffChan <- struct{}{}

}()

for range backOffChan {

    d := time.Duration(10 * time.Millisecond)

    log.Printf("reconnecting in %s", d)

    select {

    case <-time.After(d):

        log.Printf("reconnected after %s", d)

        return

    }

}

這將等到backOffChan收到消息而不燒緊循環。


(請注意,此代碼還解決了使用log.Println格式化指令的問題 - 這些問題已更正為log.Printf)。


在這里查看它的實際效果:https ://play.golang.org/p/ksAzOq5ekrm


查看完整回答
反對 回復 2023-07-17
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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