我正在开发一个 websocket,最近开始使用race. go run -race serve.go得到这个结果:WARNING: DATA RACEWrite at 0x0000019ab4a8 by goroutine 95: go-api/client.ServeWs()Previous write at 0x0000019ab4a8 by goroutine 117: go-api/client.ServeWs()我正在使用gorilla/mux并将其中一个请求升级到 websockets。我不确定它是否是由其他原因引起的,但即使是这个非常简单的设置仍然显示出竞争条件。我的猜测是因为websocket同时被两个例程写入,但只要两个请求都升级了,这有关系吗?或者是否有可能由于竞争条件而断开连接? //serve.go mux.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) { client.ServeWs(w, r) })//client.gofunc 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 }}
1 回答
开心每一天1111
TA贡献1836条经验 获得超13个赞
因为升级器不依赖于请求,所以可以在包级别创建升级器
var upgrader = websocket.Upgrader{ ... fields as in ServeWs ... }
并从 ServeWs 中删除对升级程序的分配。
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()
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报
0/150
提交
取消