为了账号安全,请及时绑定邮箱和手机立即绑定

为两个以上的 goroutine 做通道

为两个以上的 goroutine 做通道

Go
湖上湖 2021-06-09 05:01:46
我不喜欢 Go 的一件事是通道接收也会从通道中删除数据。这仅允许两个 goroutine 相互通信,即使有几种情况下两个或多个 goroutine 应该能够相互通信。我知道我可以创建一组通道并为每个 goroutine 设置通道,但是将数据从一个 goroutine 移动到所有其他 goroutine 比将数据的一个副本移动到所有 goroutine 上的数据要多得多。考虑一个案例,当我有数千个客户端连接到服务器,我希望一个只向其中一半发送消息,即接收该消息的 500 个 goroutine。如果消息是 512 字节,这将在 ram 移动中变成 250 KB 的数据,即使如果通道在接收时不删除数据,则可能只移动一次相同的数据。所以我问是否有一些简单的方法可以做到这一点,还是我必须使用同步包中的互斥锁?虽然请告诉我是否计算错误并且通道不复制数据,因为在这种情况下我只能管理通道数组。
查看完整描述

2 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我通常做这样的事情:


type Message struct {

    text string

    address string

    ...

}


type Server {

    dropbox chan Message

    clients []*Conn

    ...

}


type Conn {

    inbox chan *Message

    ...

}

每个客户端,由读/写 go 例程提供服务,将“消息”放入“保管箱”。服务器从“保管箱”中提取消息,并根据“地址”确定将消息发送到哪些客户端。


在服务器中,“客户端”甚至可以是地图。这实际上取决于您希望如何路由消息:特定的客户端、组等。


你可以用 做一些聪明的事情chan chan T,但是如果你想做智能路由而不是盲目的广播,你真的需要某种方式将消息映射到客户端。


在这种情况下,您不需要互斥锁。在某些情况下,互斥体是最好的,但在这种情况下,通道要容易得多。


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信