1 回答

TA貢獻1828條經(jīng)驗 獲得超6個贊
阻塞是如何發(fā)生的?在這種情況下是什么阻止了什么?
如果另一側(cè)沒有相應(yīng)的接收操作(或者如果通道是nil
,則成為沒有接收器的情況),則無緩沖通道上的每個發(fā)送都會阻塞。
考慮到main
調(diào)用boring
和fanIn
順序發(fā)生的情況。特別是這一行:
c := fanIn(boring("Joe"), boring("Ann"))
有評估順序:
boring("Joe")
boring("Ann")
fanIn
中的發(fā)送操作并在 中boring("Joe")
具有boring("Ann")
相應(yīng)的接收操作fanIn
,因此它們會阻塞直到fanIn
運行。因此boring
產(chǎn)生了自己的 goroutine 以確保它在fanIn
可以開始接收之前返回通道。
中的發(fā)送操作在 中fanIn
具有相應(yīng)的接收操作main
,因此它們將阻塞直到fmt.Println(<-c)
運行。因此fanIn
產(chǎn)生它自己的 goroutine(s) 以確保它在main
可以開始接收它之前返回輸出通道。
finallymain
的執(zhí)行讓fmt.Println(<-c)
一切都開始運轉(zhuǎn)。接收c
解除阻塞c <- <-input[1|2]
和接收<-input[1|2]
解除阻塞c <- fmt.Sprintf("%s %d", msg, i)
。
如果去掉 中的接收操作main
,main
仍然可以繼續(xù)執(zhí)行,程序馬上退出,不會發(fā)生死鎖。
- 1 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報