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

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

我怎樣才能擁有一個(gè)等待來(lái)自多個(gè)其他人的值的 goroutine 函數(shù)?

我怎樣才能擁有一個(gè)等待來(lái)自多個(gè)其他人的值的 goroutine 函數(shù)?

Go
茅侃侃 2022-05-18 10:40:42
我創(chuàng)建了一個(gè)Go 操場(chǎng)示例來(lái)說(shuō)明我在說(shuō)什么。在示例中,我創(chuàng)建了一個(gè) goroutine,func2,我只想通過(guò)它的通道等待輸入,并在它到達(dá)后打印值。func func2(ch chan int) {    fmt.Println("func2")    v:=<-ch    fmt.Println(v)}然后,在一個(gè)循環(huán)中,我為另一個(gè)函數(shù)創(chuàng)建 goroutine,這些是 WaitGroup 的一部分。func func1(ch chan int, wg *sync.WaitGroup) {    fmt.Println("func1")    ch <- 11032    wg.Done()}總的來(lái)說(shuō),我等待 WaitGroup。我遇到了僵局,我不知道如何解決它。很清楚我想要實(shí)現(xiàn)的目標(biāo),我希望 func2 在我調(diào)用它后作為線程保持打開狀態(tài),以處理 n 個(gè)值,其中 n 是我為 func1 調(diào)用的 goroutine 的數(shù)量。我考慮在 func2 中使用 WaitGroup Wait,但我不希望它阻塞,因?yàn)樗枰?func1 發(fā)送時(shí)處理新數(shù)據(jù)。
查看完整描述

2 回答

?
梵蒂岡之花

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

我認(rèn)為您遇到了僵局,因?yàn)槟鷉unc2只消耗了1 個(gè)值ch,然后完成。然后其他func1goroutine 被卡住等待ch可以寫入,他們不能這樣做,因?yàn)閏h在另一端沒有其他 goroutine 可以讀取。


由于您希望func2從chuntil開始持續(xù)消耗值ch,因此您需要func2像這樣創(chuàng)建一個(gè)循環(huán):


func func2(ch chan int) {

    fmt.Println("func2")

    for v := range ch {

        fmt.Println(v)

    }

}

這將保持func2“活躍”并閱讀,ch直到你在close(ch)其他地方做。在您的示例中關(guān)閉的適當(dāng)位置ch可能在mainafter wg.Wait()。


如果您想確保Println在程序完成之前看到所有語(yǔ)句的結(jié)果,您還應(yīng)該使用一些同步機(jī)制來(lái)等待func2完成。否則main將立即結(jié)束,之后close(ch)可能會(huì)或可能不會(huì)在func2打印收到的每個(gè)值之前。


一種常見的技術(shù)是“完成”通道。例如:


func func2(ch chan int, done chan bool) {

    fmt.Println("func2")

    for v := range ch {

        fmt.Println(v)

    }

    done <- true

}

并在main:


done := make(chan bool)

go func2(ch, done)

...

wg.Wait()

close(ch)

<-done

使用chan struct{}(empty struct) 也很常見,因?yàn)榭战Y(jié)構(gòu)不需要內(nèi)存。


查看完整回答
反對(duì) 回復(fù) 2022-05-18
?
蝴蝶不菲

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

您正在尋找的是一種在所有值都完成流式傳輸時(shí)關(guān)閉通道的干凈方法。當(dāng)新值出現(xiàn)時(shí),您可以創(chuàng)建一個(gè)新通道并開始在此流式傳輸值。我就是這樣做的,也許有幫助


var wg sync.WaitGroup


toUpdate := make(chan *someType, BufferSize)


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

    go processEvents(toUpdate, &wg)

}


// // wait till all the checks have come back

go func(toUpdate chan * someType, group *sync.WaitGroup) {

    group.Wait()

    close(toCreate)

}(toCreate, toUpdate, &wg)


查看完整回答
反對(duì) 回復(fù) 2022-05-18
  • 2 回答
  • 0 關(guān)注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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