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

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

有沒有可靠的方法來確保 Go 通道在讀取時不會阻塞?

有沒有可靠的方法來確保 Go 通道在讀取時不會阻塞?

Go
搖曳的薔薇 2021-10-04 09:39:58
這是對上一個具有相似名稱的線程的后續操作。它有一個公認的答案,但該答案并不能真正回答問題。從那個線程,這里是用例:if len(myChannel) > 0 {   // Possible issue here: length could have changed to 0 making this blocking   elm := <- myChannel   return elm }OP 稱其為“可能的問題”,但它是一個確定的問題:一種競爭條件,其中另一個消費者可能從 if 條件的評估和兩個語句的執行之間的通道中提取了一個值?,F在,我們被告知 Go Way 更傾向于通道而不是互斥鎖,但在這里,如果不將互斥鎖和通道配對在一起,并使用我們新的并發數據類型而不是通道??梢詥幔空娴臎]有辦法通過提前檢查空間來可靠地確保 recv 不會阻塞嗎?(與 Java 中的 BlockingQueue.poll() 或其他基于隊列的消息傳遞 IPC 設施中的類似設施相比...)
查看完整描述

2 回答

?
ibeautiful

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

Rob Napier 的回答是正確的。

但是,您可能過于努力地實現非阻塞行為,假設它是一種反模式。

使用 Go,您不必擔心阻塞。繼續,無罪地阻止。它可以使代碼更容易編寫,尤其是在處理 i/o 時。

CSP 允許您設計數據驅動的并發程序,這些程序可以很好地擴展(因為不會過多地使用互斥鎖)。通過通道進行通信的一小組 goroutine 可以表現得像一個更大系統的組件;這些組件(也通過通道進行通信)可以組合成更大的組件;這種模式以越來越大的比例重復。

傳統上,人們從順序代碼開始,然后嘗試通過添加 goroutine、通道、互斥體等來添加并發。 作為練習,嘗試不同的東西:嘗試設計一個最大并發的系統- 盡可能深入使用 goroutine 和通道。您可能對您實現的性能不滿意……所以也許可以嘗試考慮如何通過組合(而不是劃分)塊來改進它,減少 goroutine 的總數,從而實現更優化的并發性。



查看完整回答
反對 回復 2021-10-04
?
慕絲7291255

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

這正是默認情況下select的用途:


var elm myType

select {

case elm = <-myChannel:

default:

}

return elm

elm如果可以,則進行分配,否則返回零值。有關更廣泛的示例,請參閱Effective Go中的“泄漏緩沖區” 。


查看完整回答
反對 回復 2021-10-04
  • 2 回答
  • 0 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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