亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何向golang初學者解釋通道阻塞機制?

如何向golang初學者解釋通道阻塞機制?

Go
泛舟湖上清波郎朗 2022-09-05 10:56:44
我是一個golang初學者,在學習頻道和日常工作時遇到了一些麻煩。我的一個卡住點是golang通道阻止機制是如何工作的。在golang tour中,它說我用我的理解做了一些實驗,并達到了結果,.這些提示并沒有真正讓我對錯誤是如何發生的了解。我用谷歌搜索過它,但我得到的幾乎每篇文章都是關于渠道的深層機制,或者它假設讀者理解了單個單詞已經給出了所有的信息。By default, sends and receives block until the other side is ready.fatal error: all goroutines are asleep - deadlock!block但作為一個初學者,我有很多疑問,比如:同一 go-routine 能否在寫入通道后執行通道讀取操作?如果某個通道被阻塞,其他 go-routine 還能向它發送消息嗎?如果 go-routine 嘗試將消息發送到被阻止的通道,會發生什么情況?它會通過錯誤,還是什么也沒發生,或者?以下是我的一個讓我感到困惑的測試?(據我所知,main func是一個go-routine,我認為它的執行是相同的)package mainimport "time"func chanWrite(s string, ch chan string) {    ch <- s    println("write", s)}func chanRead(ch chan string) {    println("read", <- ch)}// main func 1func main() {    ch := make(chan string)    go chanWrite("A", ch)    time.Sleep(time.Second)}// main func 1 didn't throw error// main func 2(modify main func 1 and then execute it)func main() {    ch := make(chan string)    chanWrite("A", ch)    time.Sleep(time.Second)}// main func 2 throw error: "fatal error: all goroutines are asleep - deadlock!"我在這個測試中看到的是在某些情況下,當我在沒有閱讀的情況下將內容寫入通道時,我得到了,有時什么也沒發生(例如在main func 1中)。fatal error那么,有人可以以一種簡單而深入的方式解釋通道塊是如何工作的,以便golang初學者可以輕松理解它嗎?
查看完整描述

2 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

goroutine 可以阻止等待通道準備好發送或接收,但通道本身永遠不會處于“阻塞”狀態。

第一個程序不會死機,因為 main 函數執行到最后并終止程序。

同一 go-routine 能否在寫入通道后執行通道讀取操作?

否,如果通道未緩沖(默認值)。對于無緩沖信道,發送 goroutine 會阻塞,直到接收 goroutine 準備就緒。

單個 goroutine 不能同時執行發送和接收。如果只有一個 goroutine 發送到通道,則 goroutine 會永遠阻塞。

如果某個通道被阻塞,其他 go-routine 還能向它發送消息嗎?

goroutine 可以在通道關閉之前的任何時間將值發送到通道。Goroutine 可以阻止等待通道準備好發送。

如果 go-routine 嘗試將消息發送到被阻止的通道,會發生什么情況?它會通過錯誤,還是什么也沒發生,或者?

Goroutine可以阻止等待頻道準備就緒。通道本身未處于阻塞狀態。


查看完整回答
反對 回復 2022-09-05
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

通道不會“阻塞”。通道上的讀取或寫入操作可能會阻塞。

對于無緩沖通道(這是您上面的內容):寫入操作將阻止寫入 goroutine,直到另一個 goroutine 準備好從該通道讀取。當讀取 goroutine 準備好讀取(即執行 <-ch)時,則寫入和讀取發生,并且兩個 goroutine 繼續運行。

對于緩沖通道:只要通道緩沖區未滿,寫入操作就不會阻塞。同樣,如果有要從通道讀取的內容,則讀取不會阻塞。

至于你的問題:

  1. 如果所討論的通道未緩沖,則寫入操作將阻塞,因為只有當另一個 goroutine 正在從該通道讀取時,寫入操作才能繼續。因此,goroutine不會進展為從通道讀取。如果這是一個緩沖通道,并且通道未滿,則相同的 goroutine 可以寫入該通道并從中讀取。

  2. 如果一個 goroutine 正在等待寫入一個通道,而另一個 goroutine 來寫入它,它也會阻塞,直到另一個 goroutine 從通道讀取。

  3. 如果 goroutine 嘗試寫入已滿的通道,它將阻塞,直到另一個 goroutine 可以從該通道讀取。


查看完整回答
反對 回復 2022-09-05
  • 2 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號