第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Go 通道和延遲

Go 通道和延遲

Go
慕的地6264312 2023-06-05 18:27:37
我只是在我的 Ubuntu 64 位環(huán)境中試驗(yàn) Go 通道,并對(duì)以下程序產(chǎn)生的輸出感到困惑。我得到輸出:0 1 2 3 退出當(dāng)我取消注釋兩個(gè)注釋行時(shí)的輸出:0 1 2 3 4 Exit請(qǐng)解釋行為。TIA。package mainimport ("fmt"    //"time")func main() {    ch := make(chan int)    done := make(chan bool)    go func() {        for i := 0; i < 5; i++ {            ch <- i        }                //time.Sleep(1 * time.Second)        done <- false    }()    go func() {        for {            select {            case message := <-ch:                fmt.Println(message)            case <-done:                return            }        }    }()    <-done    fmt.Println("Exit")}
查看完整描述

3 回答

?
汪汪一只貓

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊

您的主線程正在等待done,然后退出。同時(shí),您的第一個(gè) go 函數(shù)將 5 個(gè)值通過管道傳輸?shù)?code>ch,然后發(fā)送到done。

then中的值done從主線程中讀取,并且恰好發(fā)生在第二個(gè) go 函數(shù)從中讀取最后一個(gè)值之前ch。當(dāng)它這樣做時(shí),它退出程序。

請(qǐng)注意,如果您的第二個(gè)線程確實(shí)碰巧同時(shí)讀取了chdone,那么您的程序?qū)⑺梨i,因?yàn)橹骶€程永遠(yuǎn)不會(huì)接收 ondone并且所有正在運(yùn)行的 go 線程將被阻塞以等待在通道上接收。


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
明月笑刀無情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊

您不是在等待兩個(gè) goroutine,而是只將一個(gè)值發(fā)送done到 2 個(gè)接收者,如果第二個(gè)接收者恰好是main.

使用 aWaitGroup可以簡化代碼,并允許您輕松等待所需數(shù)量的 goroutine。https://play.golang.org/p/MWknv_9AFKp

ch := make(chan int)

var wg sync.WaitGroup


wg.Add(1)

go func() {

    defer wg.Done()

    defer close(ch)

    for i := 0; i < 5; i++ {

        ch <- i

    }

}()


wg.Add(1)

go func() {

    defer wg.Done()

    for message := range ch {

        fmt.Println(message)

    }


}()


wg.Wait()

fmt.Println("Exit")


查看完整回答
反對(duì) 回復(fù) 2023-06-05
?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊

您有兩個(gè)go并行運(yùn)行的例程。一個(gè)向通道中插入 5 個(gè)數(shù)字,然后向主線程發(fā)出退出信號(hào),另一個(gè)從通道中讀取數(shù)字。

請(qǐng)注意,一旦負(fù)責(zé)將數(shù)字排入通道的 go 例程完成,它就會(huì)向主線程發(fā)出退出信號(hào),而不管讀取數(shù)字的 go 例程是否完成。因此,您可能會(huì)遇到這樣一種情況,即入隊(duì)例程在出隊(duì)完成之前完成,并且主線程退出。

通過添加睡眠,您可以使入隊(duì)例程的壽命更長一些,并讓出隊(duì)例程有機(jī)會(huì)在入隊(duì)例程向主線程發(fā)出退出信號(hào)之前讀取和打印所有數(shù)字。

要解決這個(gè)問題,您可以只在主線程中運(yùn)行出隊(duì)代碼。在這種情況下,無需在 go 例程中運(yùn)行它。


查看完整回答
反對(duì) 回復(fù) 2023-06-05
  • 3 回答
  • 0 關(guān)注
  • 162 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)