我正在嘗試按照 Go Concurrency 書實現橋接模式func bridge_impl() { done := make(chan interface{}) defer close(done) var wg sync.WaitGroup bridge := func( done <-chan interface{}, chanStream <-chan <-chan interface{}, ) <-chan interface{} { valStream := make(chan interface{}) go func() { wg.Add(1) defer close(valStream) for { var stream <-chan interface{} select { case maybeStream, ok := <-chanStream: fmt.Println("works") if ok == false { return } stream = maybeStream case <-done: return } for val := range stream { select { case valStream <- val: case <-done: } } } }() return valStream } genVals := func() <-chan <-chan interface{} { chanStream := make(chan (<-chan interface{})) go func() { wg.Add(1) defer close(chanStream) for i := 0; i < 10; i++ { stream := make(chan interface{}) stream <- i close(stream) chanStream <- stream } }() return chanStream } for v := range bridge(done, genVals()) { fmt.Printf("%v ", v) } wg.Wait()}但是我一開始收到一個死鎖錯誤all goroutines are asleep - deadlock!,我想我應該添加一個等待組,即使它沒有在書中的例子中實現,但我最終還是遇到了同樣的錯誤
2 回答

DIEA
TA貢獻1820條經驗 獲得超2個贊
據我了解,您根本不需要 WaitGroup,您只需要重新排序genVals函數循環中的語句:
for i := 0; i < 10; i++ {
stream := make(chan interface{})
chanStream <- stream
stream <- i
close(stream)
}
https://go.dev/play/p/7D9OzrsvZyi

茅侃侃
TA貢獻1842條經驗 獲得超21個贊
有兩個主要問題。
第一期:
for i := 0; i < 10; i++ {
stream := make(chan interface{})
stream <- i
close(stream)
chanStream <- stream
}
創建后寫入無緩沖通道,沒有 goroutine 讀取。使用緩沖通道或其他 goroutine。
stream := make(chan interface{}, 1) // buffer size 1 to not block `stream <- i`
第二期:不
使用。 您可以在這兩種情況下使用。wg.Add(1)wg.Done()
defer
wg.Add(1)
defer wg.Done()
- 2 回答
- 0 關注
- 167 瀏覽
添加回答
舉報
0/150
提交
取消