3 回答

TA貢獻1842條經驗 獲得超13個贊
一個無緩沖的通道寫入將阻塞,直到另一個 goroutine 從中讀取。發生這種情況時,讀取和寫入 goroutine 都會啟用。之后,無法保證執行將如何進行。
在您的示例中,firstFunc
從通道讀取后,它會運行直到完成。主 goroutine 寫入通道 2,啟用secondFunc
,但在它有機會完成寫入之前,主 goroutine 結束。
這里的問題是有許多可能的執行順序,而您碰巧觀察到一種特定的順序。

TA貢獻2039條經驗 獲得超8個贊
您看不到輸出,secondFunc因為 main 在它有機會執行之前就結束了。解決此問題的一種簡單方法是time.Sleep(time.Second)在打印“main() 結束”之前添加。
更正確的方法是使用等待組,如下所示:
wg := sync.WaitGroup{}
wg.Add(2)
go func() { firstFunc(c1); wg.Done() }()
go func() { secondFunc(c2); wg.Done() }()
... // write to channels
wg.Wait() // This blocks till both the go-routines are done

TA貢獻1757條經驗 獲得超7個贊
它不會因為有 2 個通道偵聽器(firstFunc 和 secondFunc)而阻塞。這些以隨機順序閱讀您的消息(以先醒來者為準)。所以阻塞是存在的,但對于活躍的聽眾來說是無法觀察到的。您唯一會看到的是,有時您會首先看到 firstFunc 的輸出,有時您會看到 secondFunc 的輸出
- 3 回答
- 0 關注
- 140 瀏覽
添加回答
舉報