第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何向golang初學(xué)者解釋通道阻塞機(jī)制?

如何向golang初學(xué)者解釋通道阻塞機(jī)制?

Go
泛舟湖上清波郎朗 2022-09-05 10:56:44
我是一個golang初學(xué)者,在學(xué)習(xí)頻道和日常工作時遇到了一些麻煩。我的一個卡住點(diǎn)是golang通道阻止機(jī)制是如何工作的。在golang tour中,它說我用我的理解做了一些實(shí)驗(yàn),并達(dá)到了結(jié)果,.這些提示并沒有真正讓我對錯誤是如何發(fā)生的了解。我用谷歌搜索過它,但我得到的幾乎每篇文章都是關(guān)于渠道的深層機(jī)制,或者它假設(shè)讀者理解了單個單詞已經(jīng)給出了所有的信息。By default, sends and receives block until the other side is ready.fatal error: all goroutines are asleep - deadlock!block但作為一個初學(xué)者,我有很多疑問,比如:同一 go-routine 能否在寫入通道后執(zhí)行通道讀取操作?如果某個通道被阻塞,其他 go-routine 還能向它發(fā)送消息嗎?如果 go-routine 嘗試將消息發(fā)送到被阻止的通道,會發(fā)生什么情況?它會通過錯誤,還是什么也沒發(fā)生,或者?以下是我的一個讓我感到困惑的測試?(據(jù)我所知,main func是一個go-routine,我認(rèn)為它的執(zhí)行是相同的)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!"我在這個測試中看到的是在某些情況下,當(dāng)我在沒有閱讀的情況下將內(nèi)容寫入通道時,我得到了,有時什么也沒發(fā)生(例如在main func 1中)。fatal error那么,有人可以以一種簡單而深入的方式解釋通道塊是如何工作的,以便golang初學(xué)者可以輕松理解它嗎?
查看完整描述

2 回答

?
慕的地6264312

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個贊

goroutine 可以阻止等待通道準(zhǔn)備好發(fā)送或接收,但通道本身永遠(yuǎn)不會處于“阻塞”狀態(tài)。

第一個程序不會死機(jī),因?yàn)?main 函數(shù)執(zhí)行到最后并終止程序。

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

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

單個 goroutine 不能同時執(zhí)行發(fā)送和接收。如果只有一個 goroutine 發(fā)送到通道,則 goroutine 會永遠(yuǎn)阻塞。

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

goroutine 可以在通道關(guān)閉之前的任何時間將值發(fā)送到通道。Goroutine 可以阻止等待通道準(zhǔn)備好發(fā)送。

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

Goroutine可以阻止等待頻道準(zhǔn)備就緒。通道本身未處于阻塞狀態(tài)。


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

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個贊

通道不會“阻塞”。通道上的讀取或?qū)懭氩僮骺赡軙枞?/p>

對于無緩沖通道(這是您上面的內(nèi)容):寫入操作將阻止寫入 goroutine,直到另一個 goroutine 準(zhǔn)備好從該通道讀取。當(dāng)讀取 goroutine 準(zhǔn)備好讀?。磮?zhí)行 <-ch)時,則寫入和讀取發(fā)生,并且兩個 goroutine 繼續(xù)運(yùn)行。

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

至于你的問題:

  1. 如果所討論的通道未緩沖,則寫入操作將阻塞,因?yàn)橹挥挟?dāng)另一個 goroutine 正在從該通道讀取時,寫入操作才能繼續(xù)。因此,goroutine不會進(jìn)展為從通道讀取。如果這是一個緩沖通道,并且通道未滿,則相同的 goroutine 可以寫入該通道并從中讀取。

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

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


查看完整回答
反對 回復(fù) 2022-09-05
  • 2 回答
  • 0 關(guān)注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號