Gorilla/Mux & Websocket Race Condition.这安全吗?



我正在开发一个websocket,最近开始使用race对比赛条件进行一些测试。go run -race serve.go

得到这个结果:

WARNING: DATA RACE
Write at 0x0000019ab4a8 by goroutine 95:
go-api/client.ServeWs()
Previous write at 0x0000019ab4a8 by goroutine 117:
go-api/client.ServeWs()

我正在使用gorilla/mux,并且正在将其中一个请求升级到websocket。我不确定是不是其他原因造成的,但即使是这个非常简单的设置仍然显示出比赛状态。我的猜测是因为websocket同时被两个例程写入,但只要两个请求都升级了,这有关系吗?或者有可能由于比赛条件而导致连接中断?

//serve.go
mux.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) {
client.ServeWs(w, r)
})
//client.go
func ServeWs(w http.ResponseWriter, r *http.Request) {
upgrader = websocket.Upgrader{
ReadBufferSize:  1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
_, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
}

因为升级程序不依赖于请求,所以可以在包级别创建升级程序

var upgrader = websocket.Upgrader{ ... fields as in ServeWs ... }

并从ServeW中移除对升级器的分配。

func ServeWs(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer c.Close()

相关内容

  • 没有找到相关文章

最新更新