我正在研究 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并將其中一個請求升級到 websockets。我不確定它是否是由其他原因引起的,但即使是這個非常簡單的設定仍然顯示出競爭狀況。我的猜測是因為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
}
}
uj5u.com熱心網友回復:
由于升級程式不依賴于請求,您可以在包級別創建升級程式
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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443005.html
下一篇:在嵌套函式中設定值
