为两个以上的 goroutine 做通道

我不喜欢 Go 的一件事是通道接收也会从通道中删除数据。这仅允许两个 goroutine 相互通信,即使有几种情况下两个或多个 goroutine 应该能够相互通信。

我知道我可以创建一组通道并为每个 goroutine 设置通道,但是将数据从一个 goroutine 移动到所有其他 goroutine 比将数据的一个副本移动到所有 goroutine 上的数据要多得多。

考虑一个案例,当我有数千个客户端连接到服务器,我希望一个只向其中一半发送消息,即接收该消息的 500 个 goroutine。如果消息是 512 字节,这将在 ram 移动中变成 250 KB 的数据,即使如果通道在接收时不删除数据,则可能只移动一次相同的数据。

所以我问是否有一些简单的方法可以做到这一点,还是我必须使用同步包中的互斥锁?虽然请告诉我是否计算错误并且通道不复制数据,因为在这种情况下我只能管理通道数组。


湖上湖
浏览 169回答 2
2回答

呼啦一阵风

我通常做这样的事情:type Message struct {    text string    address string    ...}type Server {    dropbox chan Message    clients []*Conn    ...}type Conn {    inbox chan *Message    ...}每个客户端,由读/写 go 例程提供服务,将“消息”放入“保管箱”。服务器从“保管箱”中提取消息,并根据“地址”确定将消息发送到哪些客户端。在服务器中,“客户端”甚至可以是地图。这实际上取决于您希望如何路由消息:特定的客户端、组等。你可以用 做一些聪明的事情chan chan T,但是如果你想做智能路由而不是盲目的广播,你真的需要某种方式将消息映射到客户端。在这种情况下,您不需要互斥锁。在某些情况下,互斥体是最好的,但在这种情况下,通道要容易得多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go