這是對上一個具有相似名稱的線程的后續操作。它有一個公認的答案,但該答案并不能真正回答問題。從那個線程,這里是用例: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 的總數,從而實現更優化的并發性。

慕絲7291255
TA貢獻1859條經驗 獲得超6個贊
這正是默認情況下select的用途:
var elm myType
select {
case elm = <-myChannel:
default:
}
return elm
elm如果可以,則進行分配,否則返回零值。有關更廣泛的示例,請參閱Effective Go中的“泄漏緩沖區” 。
- 2 回答
- 0 關注
- 218 瀏覽
添加回答
舉報
0/150
提交
取消