3 回答
TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
大流子流器將阻止等待寫(xiě)入通道,因?yàn)橥ǖ雷x取發(fā)生在大流子流結(jié)束之后(在wg.完成),因此出現(xiàn)死鎖。
這里的簡(jiǎn)單解決方案是擺脫等待組。通道讀取操作將阻塞,直到 goroutine 寫(xiě)入通道,因此在讀取兩個(gè)通道后,無(wú)需等待。
TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
事實(shí)上,這里并不是真的需要等待小組。但是,如果您想繼續(xù)試驗(yàn)戈魯丁和通道,那么您也可以嘗試使通道緩沖,例如:
c1 := make(chan string, 1) c2 := make(chan string, 1)
然后發(fā)生的事情是,您可以為每個(gè)通道寫(xiě)入單個(gè)條目而不會(huì)阻塞。
TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
讀取/寫(xiě)入無(wú)緩沖通道是阻塞調(diào)用,這意味著這些行:
c <- "foo" c <- "bar"
將掛起,直到您到達(dá)從通道中提取值的調(diào)用,即這些行:
foo := <-c1 bar := <-c2
死鎖的原因是在這兩行之前調(diào)用。為了移動(dòng)過(guò)去,所有等待組必須完成,但您的等待組不能完成,因?yàn)楸煌七t到/取消阻止。如前所述,在到達(dá) / 之前,無(wú)法取消阻止這些內(nèi)容,并且由于 .你可以看到怎么可能沒(méi)有進(jìn)展,因此僵局。wg.Wait()wg.Wait()wg.Done()c <- "foo"c <- "bar"foo := <-c1bar := <-c2wg.Wait()
最佳做法是避免使用等待組和互斥鎖,直到絕對(duì)必要。通常,(就像在這種情況下)解決方案在純Go中是可能的,這些包只會(huì)使代碼復(fù)雜化。
- 3 回答
- 0 關(guān)注
- 88 瀏覽
添加回答
舉報(bào)
