我無法理解以下代碼摘錄。run() fn 作為 goroutine 執行,我認為它負責將“gloabl”廣播頻道中的所有條目分派到相應的客戶端頻道(chan.send)。我在 case 子句的第二個 select 陳述句中迷失了方向。它是否僅在 client.send 通道中推送訊息結構,還是這種特定語法還有更多內容?
func (h *Hub) run() {
for {
select {
...
case message := <-h.broadcast:
for client := range h.clients[someid] { //clients = make(map[int][]*Client)
select {
case client.send <- message: //???
default:
close(client.send)
delete(h.clients, client)
}
}
}
}
}
uj5u.com熱心網友回復:
這稱為非阻塞發送。規范:選擇陳述句:
如果一個或多個通信可以進行,則通過統一的偽隨機選擇選擇一個可以進行的通信。否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”陳述句會阻塞,直到至少有一個通信可以繼續。
如果該陳述句的通信操作select都沒有準備好,并且有一個default案例,則立即選擇它,而不等待通信。ops 將在未來某個時間做好準備。
有問題的代碼嘗試在客戶端的通道上發送訊息,如果它還沒有準備好,客戶端會立即被丟棄。如果發送可以繼續(因為通道緩沖區中有空間或者有一個 goroutine 準備好從通道接收),則執行發送操作,并且回圈繼續下一次迭代(前進到下一個客戶端)。
其意圖可能是防止慢速或死機客戶端減慢甚至阻塞整個集線器。使用類似的無條件發送操作client.send <- message,如果客戶端還沒有準備好接收和處理訊息,這將阻塞,基本上阻塞所有其他客戶端和集線器本身。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/457416.html
上一篇:從地圖回傳空陣列而不是空字串陣列
