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

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
您正在調(diào)用wg.Wait
一個(gè) goroutine,因此main
可以在其他例程完成之前返回(因此您的程序退出)。這會(huì)導(dǎo)致您看到的行為,但僅從 Goroutine 中取出是不夠的。
您還濫用了WaitGroup
一般性;你的Add
和Done
調(diào)用 彼此不相關(guān),并且你沒(méi)有那么多Done
s Add
,所以 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è)Add
s。該代碼需要進(jìn)行重大修改才能按預(yù)期工作。
- 2 回答
- 0 關(guān)注
- 149 瀏覽
添加回答
舉報(bào)