我不喜歡 Go 的一件事是通道接收也會(huì)從通道中刪除數(shù)據(jù)。這僅允許兩個(gè) goroutine 相互通信,即使有幾種情況下兩個(gè)或多個(gè) goroutine 應(yīng)該能夠相互通信。我知道我可以創(chuàng)建一組通道并為每個(gè) goroutine 設(shè)置通道,但是將數(shù)據(jù)從一個(gè) goroutine 移動(dòng)到所有其他 goroutine 比將數(shù)據(jù)的一個(gè)副本移動(dòng)到所有 goroutine 上的數(shù)據(jù)要多得多??紤]一個(gè)案例,當(dāng)我有數(shù)千個(gè)客戶端連接到服務(wù)器,我希望一個(gè)只向其中一半發(fā)送消息,即接收該消息的 500 個(gè) goroutine。如果消息是 512 字節(jié),這將在 ram 移動(dòng)中變成 250 KB 的數(shù)據(jù),即使如果通道在接收時(shí)不刪除數(shù)據(jù),則可能只移動(dòng)一次相同的數(shù)據(jù)。所以我問(wèn)是否有一些簡(jiǎn)單的方法可以做到這一點(diǎn),還是我必須使用同步包中的互斥鎖?雖然請(qǐng)告訴我是否計(jì)算錯(cuò)誤并且通道不復(fù)制數(shù)據(jù),因?yàn)樵谶@種情況下我只能管理通道數(shù)組。
2 回答

呼啦一陣風(fēng)
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
我通常做這樣的事情:
type Message struct {
text string
address string
...
}
type Server {
dropbox chan Message
clients []*Conn
...
}
type Conn {
inbox chan *Message
...
}
每個(gè)客戶端,由讀/寫 go 例程提供服務(wù),將“消息”放入“保管箱”。服務(wù)器從“保管箱”中提取消息,并根據(jù)“地址”確定將消息發(fā)送到哪些客戶端。
在服務(wù)器中,“客戶端”甚至可以是地圖。這實(shí)際上取決于您希望如何路由消息:特定的客戶端、組等。
你可以用 做一些聰明的事情chan chan T,但是如果你想做智能路由而不是盲目的廣播,你真的需要某種方式將消息映射到客戶端。
在這種情況下,您不需要互斥鎖。在某些情況下,互斥體是最好的,但在這種情況下,通道要容易得多。
- 2 回答
- 0 關(guān)注
- 191 瀏覽
添加回答
舉報(bào)
0/150
提交
取消