所以我正在使用 gorillas websocket 库,当我收到一个连接时,我正在构建一个 websocket 服务器 我创建了 2 个 go 例程,一个用于读取来自客户端的传入消息,另一个用于侦听发送到通道的传入消息,然后发送它们给客户。
func (p *Player) EventLoop() {
l4g.Info("Starting player %s event loop", p)
go p.readFromSocket()
go p.writeToSocket()
//blocks until we receive an interrupt from the read channel
<-p.closeEventChan
p.cleanup() //nothing else to do so lets cleanup
}
func (p *Player) writeToSocket() {
for m := range p.writeChan {
if p.conn == nil {
break
}
if reflect.DeepEqual(network.Packet{}, m) == true {
break
}
if err := p.conn.WriteJSON(m); err != nil {
break
}
}
p.closeEventChan <- true
}
func (p *Player) readFromSocket() {
for {
if p.conn == nil {
break
}
m := network.Packet{}
if err := p.conn.ReadJSON(m); err != nil {
break
}
}
p.closeEventChan <- true
}
func (p *Player) Cleanup() {
//make sure the channels get a close message which will break us out of the go routines
close(p.writeChan)
close(p.closeEventChan)
//only close the connection if we have a connection
if p.conn != nil {
p.conn.Close()
p.conn = nil
}
}
我的问题是如果我们离开readFromSocket()循环Cleanup()被调用但是我们永远不会离开writeToSocket()循环!这个问题可以在这个 go playground https://play.golang.org/p/49bh7bbbG- 中更简单地演示
我们如何解决这个问题,所以如果我们离开writeToSocket()循环,我们也会离开readFromSocket()循环,反之亦然?
我的印象是,这就像您在通道 ( close(p.writeChan))上调用 close 一样工作,通道接受的默认值将被发送
翻翻过去那场雪
相关分类