我想有兩個單獨的消費者去例程,將來自輸入通道篩選出偶數和奇數。這只是一個玩具的例子,以便看看消費者是否有可能通過從輸入通道讀取的消息做某些事情(如果它符合某些條件的話),否則放回到輸入通道。「消費或放回」去渠道
我當前的代碼如下:
package main
func filterOdd(ch chan int, out chan int) {
val := <- ch
if val % 2 == 0 {
ch <- val
} else {
out <- val
}
}
func filterEven(ch chan int, out chan int) {
val := <- ch
if val % 2 != 0 {
ch <- val
} else {
out <- val
}
}
func main() {
even := make(chan int)
odd := make(chan int)
input := make(chan int)
go filterOdd(input, odd)
go filterEven(input, even)
for i:=1; i <= 10; i++ {
input <- i
}
println("Even...")
for i := range even {
println(i)
}
println("Odd...")
for i := range odd {
println(i)
}
}
然而,這將產生以下的輸出:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/tmp/sandbox594577124/main.go:27 +0x140
goroutine 4 [chan send]:
main.filterOdd(0x10336100, 0x103360c0)
/tmp/sandbox594577124/main.go:8 +0xc0
created by main.main
/tmp/sandbox594577124/main.go:24 +0xc0
鏈接到去遊樂場:https://play.golang.org/p/9RIvFsGKI-
@ZanLynx:雖然這個問題說他們在示例代碼中遇到了一個死鎖,但聽起來他們聽起來並不像在其他問題中所做的那樣。 –
@JamesHenstridge當然不是一回事。但它看起來像這個問題的一般問題和解決方案是相同的。 –
我只注意到,即使你修復了緩衝區,你的for循環不在goroutine中,因此會阻塞,除非你總是使緩衝區大於循環的大小。 –