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

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

通道提前終止

通道提前終止

Go
牛魔王的故事 2023-07-17 13:57:25
我正在為管道制作一系列 go 例程的原型,每個(gè)例程都執(zhí)行一個(gè)轉(zhuǎn)換。例程在所有數(shù)據(jù)通過(guò)之前終止。我查了多納萬(wàn)和克尼漢的書(shū),并在谷歌上搜索了解決方案。這是我的代碼:package mainimport (    "fmt"    "sync")func main() {    a1 := []string{"apple", "apricot"}    chan1 := make(chan string)    chan2 := make(chan string)    chan3 := make(chan string)    var wg sync.WaitGroup    go Pipe1(chan2, chan1, &wg)    go Pipe2(chan3, chan2, &wg)    go Pipe3(chan3, &wg)    func (data []string) {        defer wg.Done()        for _, s := range data {            wg.Add(1)            chan1 <- s        }        go func() {            wg.Wait()            close(chan1)        }()    }(a1)}func Pipe1(out chan<- string, in <-chan string, wg *sync.WaitGroup) {    defer wg.Done()    for s := range in {        wg.Add(1)        out <- s + "s are"    }}func Pipe2(out chan<- string, in <-chan string, wg *sync.WaitGroup) {    defer wg.Done()    for s := range in {        wg.Add(1)        out <- s + " good for you"    }}func Pipe3(in <-chan string, wg *sync.WaitGroup) {    defer wg.Done()    for s := range in {        wg.Add(1)        fmt.Println(s)    }}我的預(yù)期輸出是:apples are good for youapricots are good for you運(yùn)行main的結(jié)果不一致。有時(shí)我同時(shí)得到兩條線。有時(shí)我只得到蘋(píng)果。有時(shí)什么也沒(méi)有輸出。
查看完整描述

2 回答

?
四季花海

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

您的 WaitGroup.Add 和 WaitGroup.Done 調(diào)用不匹配。然而,在這種情況下,“我完成了”信號(hào)通常是通過(guò)關(guān)閉輸出通道來(lái)給出的。僅當(dāng)工作在多個(gè) goroutine 之間共享時(shí)才需要 WaitGroups(即多個(gè) goroutine 消耗相同的通道),但這里的情況并非如此。


package main


import (

? ? "fmt"

)


func main() {

? ? a1 := []string{"apple", "apricot"}


? ? chan1 := make(chan string)

? ? chan2 := make(chan string)

? ? chan3 := make(chan string)


? ? go func() {

? ? ? ? for _, s := range a1 {

? ? ? ? ? ? chan1 <- s

? ? ? ? }


? ? ? ? close(chan1)

? ? }()


? ? go Pipe1(chan2, chan1)

? ? go Pipe2(chan3, chan2)


? ? // This range loop terminates when chan3 is closed, which Pipe2 does after

? ? // chan2 is closed, which Pipe1 does after chan1 is closed, which the

? ? // anonymous goroutine above does after it sent all values.

? ? for s := range chan3 {

? ? ? ? fmt.Println(s)

? ? }

}


func Pipe1(out chan<- string, in <-chan string) {

? ? for s := range in {

? ? ? ? out <- s + "s are"

? ? }


? ? close(out) // let caller know that we're done

}


func Pipe2(out chan<- string, in <-chan string) {

? ? for s := range in {

? ? ? ? out <- s + " good for you"

? ? }


? ? close(out) // let caller know that we're done

}

在操場(chǎng)上嘗試一下:https ://play.golang.org/p/d2J4APjs_lL


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

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

您正在調(diào)用wg.Wait一個(gè) goroutine,因此main可以在其他例程完成之前返回(因此您的程序退出)。這會(huì)導(dǎo)致您看到的行為,但僅從 Goroutine 中取出是不夠的。

您還濫用了WaitGroup一般性;你的AddDone調(diào)用 彼此不相關(guān),并且你沒(méi)有那么多DoneAdd,所以 sWaitGroup永遠(yuǎn)不會(huì)完成。如果您在循環(huán)中調(diào)用Add,則每次循環(huán)迭代也必須導(dǎo)致調(diào)用Done;正如您現(xiàn)在所擁有的,您defer wg.Done()在每個(gè)循環(huán)之前,然后Add在循環(huán)內(nèi)部調(diào)用,從而產(chǎn)生一個(gè)Done和多個(gè)Adds。該代碼需要進(jìn)行重大修改才能按預(yù)期工作。


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

添加回答

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