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

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

我應(yīng)該在哪個(gè)函數(shù)中傳遞 WaitGroup?

我應(yīng)該在哪個(gè)函數(shù)中傳遞 WaitGroup?

Go
小唯快跑啊 2023-06-05 18:02:16
我做了一個(gè)簡(jiǎn)單的代碼示例來(lái)了解管道的用法,就在這里。package mainimport (    "fmt"    "sync"    "time")func main() {    ch1 := make(chan int, 10) // Use buffered channel so as to avoid clogging    ch2 := make(chan string, 10)    var wg sync.WaitGroup    for i := 0; i < 3; i++ {        wg.Add(1)        go func1(i, ch1, &wg)        go func2(ch1, ch2)    }    wg.Wait()    close(ch1)    for val := range ch2 {        fmt.Println(val)    }}func func1(seconds int, ch chan<- int, wg *sync.WaitGroup) {    defer wg.Done()    time.Sleep(time.Duration(seconds) * time.Second)    fmt.Println(seconds)    ch <- seconds}func func2(ch1 chan int, ch2 chan string) {    for range ch1 {        ch2 <- "hello"    }    close(ch2)}現(xiàn)在,問(wèn)題是我沒(méi)有得到一致的輸出(我知道這是一些并發(fā)問(wèn)題,我還沒(méi)有完全理解)。輸出> go run pipeline-loop.go 012hellohello> go run pipeline-loop.go 012hellohellohello> go run pipeline-loop.go 012hellohello> go run pipeline-loop.go 012hellohello> go run pipeline-loop.go 012hellohellopanic: close of closed channelgoroutine 6 [running]:main.func2(0xc00006c000, 0xc000056180)    /home/projects/go-tuts/pipeline-loop.go:36 +0x72created by main.main    /home/projects/go-tuts/pipeline-loop.go:16 +0x10fexit status 2另一個(gè)人更改了代碼(它正在運(yùn)行)并放在func2循環(huán)之外,但我func2希望func1.問(wèn)題所以,我想了解應(yīng)該在哪里使用WaitGroup和?close(ch)謝謝。Temporarya(一個(gè) golang noobie)
查看完整描述

2 回答

?
吃雞游戲

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

您的代碼中存在多個(gè)問(wèn)題。

在循環(huán)中,您正在生成多個(gè) (3) goroutines 運(yùn)行func2,并且在中func2,您將數(shù)據(jù)發(fā)送到ch2并調(diào)用close(ch2)。這是個(gè)問(wèn)題。ch2當(dāng)一個(gè) goroutine 將數(shù)據(jù)發(fā)送到時(shí),另一個(gè)goroutine 可能會(huì)關(guān)閉該通道,這會(huì)導(dǎo)致:

panic: close of closed channel


goroutine 6 [running]:

main.func2(0xc00006c000, 0xc000056180)

? ? /home/projects/go-tuts/pipeline-loop.go:36 +0x72

created by main.main

? ? /home/projects/go-tuts/pipeline-loop.go:16 +0x10f

exit status 2

通常,您不需要多次關(guān)閉通道 - 您只需要在它們?nèi)客瓿珊箨P(guān)閉它們。WaitGroup為此你需要另一個(gè);您需要將兩個(gè)函數(shù)都傳遞給 a?WaitGroup。

更新:

我個(gè)人使用一種“工作”模式,將數(shù)據(jù)生成到同一通道,并且在完成所有工作后需要關(guān)閉該通道:

for something {

? ? wg.Add(1)

? ? go func(i int) {

? ? ? ? work(ch)

? ? ? ? wg.Done()

? ? }

}


go func() {

? ? wg.Wait()

? ? close()

}()

我認(rèn)為保持 API 清潔是一個(gè)好主意,WorkGroup因?yàn)閃orkGroup它是關(guān)于如何同步工作而不是如何完成工作的。


我已將您的代碼更改為這種模式:https ://play.golang.org/p/vdCNsxWhgyQ


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

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

我懷疑您只希望一個(gè)通道從 ch1 讀取并寫入 ch2。創(chuàng)建 3 個(gè) go-routines 來(lái)做同樣的事情沒(méi)有多大意義(而且你最終也會(huì)關(guān)閉相同的通道 multiple time 這會(huì)導(dǎo)致恐慌,正如 leaf bebop 指出的那樣)


func main() {

    ch1 := make(chan int, 10) // Use buffered channel so as to avoid clogging

    ch2 := make(chan string, 10)

    var wg sync.WaitGroup

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

        wg.Add(1)

        go func1(i, ch1, &wg)

    }

    go func2(ch1, ch2)

    wg.Wait()

    close(ch1)

    for val := range ch2 {

        fmt.Println(val)

    }

}


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

添加回答

舉報(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)