【发布时间】:2017-12-01 22:57:01
【问题描述】:
我正在寻找在 go 中多路复用某些通道输出的解决方案。
我有一个数据源,它是从 io.Reader 读取的数据,我将其发送到单个通道。另一方面,我有一个从通道读取的 websocket 请求处理程序。现在碰巧有两个客户端创建了一个 websocket 连接,都从同一个通道读取,但每个客户端都只获取部分消息。
代码示例(简化):
func (b *Bootloader) ReadLog() (<-chan []byte, error) {
if b.logCh != nil {
logrus.Warn("ReadLog called while channel already exists!")
return b.logCh, nil // This is where we get problems
}
b.logCh = make(chan []byte, 0)
go func() {
buf := make([]byte, 1024)
for {
n, err := b.p.Read(buf)
if err == nil {
msg := make([]byte, n)
copy(msg, buf[:n])
b.logCh <- msg
} else {
break
}
}
close(b.logCh)
b.logCh = nil
}()
return b.logCh, nil
}
现在当ReadLog()被调用两次时,第二次调用只是返回了第一次调用中创建的通道,这就导致了上面解释的问题。
问题是:如何正确复用?
关心发送或接收站点上的多路复用是否更好/更容易/更符合理念?
我应该对接收者隐藏频道并使用回调吗?
我现在有点卡住了。欢迎任何提示。
【问题讨论】:
-
你追求的是所谓的“扇出”,你可以开始here。
-
不,扇出是提问者得到但不想要的:多个客户端从同一个频道读取。
标签: go channel multiplexing