use*_*214 7 go websocket gorilla
我研究过gorilla/websocket包的godoc。
在 Godoc 中明确指出,
并发连接支持一个并发读取器和一个并发写入器。
应用程序负责确保不超过一个 goroutine 同时调用写入方法(NextWriter、SetWriteDeadline、WriteMessage、WriteJSON、EnableWriteCompression、SetCompressionLevel),并且不超过一个 goroutine 调用读取方法(NextReader、SetReadDeadline、ReadMessage、ReadJSON、SetPongHandler) , SetPingHandler) 并发。
Close 和 WriteControl 方法可以与所有其他方法同时调用。
但是,在包提供的示例之一中
func (c *Conn) readPump() {
defer func() {
hub.unregister <- c
c.ws.Close()
}()
c.ws.SetReadLimit(maxMessageSize)
c.ws.SetReadDeadline(time.Now().Add(pongWait))
c.ws.SetPongHandler(func(string) error {
c.ws.SetReadDeadline(time.Now().Add(pongWait)); return nil
})
for {
_, message, err := c.ws.ReadMessage()
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) {
log.Printf("error: %v", err)
}
break
}
message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1))
hub.broadcast <- message
}
}
这条线
c.ws.SetPongHandler(func(string) error {
c.ws.SetReadDeadline(time.Now().Add(pongWait)); return nil
})
和这条线
_, message, err := c.ws.ReadMessage()
serveWs
SetReadDeadlineReadMessageSetPongHandlerSetPingHandler
ReadMessage
有没有更好的方法来处理这个并发问题?提前致谢。