我正在開發一個 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 關注
- 123 瀏覽
添加回答
舉報
0/150
提交
取消