后端程序启动后 120 秒左右就卡死了,无论推送速度是快还是慢,总是会卡死。没有任何报错信息。
后端用的是 go,gin 框架中开了 2 个协程,1 个用来接受数据,1 个用来入库和用 websocket 发给前端。
接受数据和数据库写入都没问题。应该就是 websocket 推给前端时的问题。也检查了协程数,都是正常的。
var upgrader = websocket.Upgrader{
// ReadBufferSize: 1024,
//WriteBufferSize: 1024,
// 允许所有的 CORS 跨域请求,正式环境可以关闭
CheckOrigin: func(r *http.Request) bool {
return true
},
}
var dataTmp []byte
func init() {
http.HandleFunc("/ws", wsHandler)
}
// 启动程序
func StartWebsocket(addrPort string) {
http.ListenAndServe(addrPort, nil)
}
func(){
...
go StartWebsocket("173.10.10.100:88")
...
}
func wsHandler(resp http.ResponseWriter, req *http.Request) {
// 答客户端告知升级连接为 websocket
wsSocket, err := upgrader.Upgrade(resp, req, nil)
if err != nil {
fmt.Println("升级为 websocket 失败", err.Error())
return
}
go wsWriteLoop(wsSocket)
}
func wsWriteLoop(wsConn *websocket.Conn) {
for {
if len(dataTmp) != 0 {
fmt.Println(time.Now())
err := wsConn.WriteMessage(websocket.TextMessage, dataTmp)
dataTmp = dataTmp[0:0]
if err != nil {
fmt.Println("发送消息给客户端发生错误", err.Error())
wsConn.Close()
return
}
}
}
}
1
ghjacky 2020-09-15 12:17:14 +08:00
for 这样用合适吗,为啥不把 dataTmp 换成 channel 呢,for 配合 select 读 dataTmp 不好吗
|
3
back0893 2020-09-15 13:28:53 +08:00
dataTmp 的问题吧.
一般来说你写的 loop 数据应该是隔离的,就算要共性,也需要加锁 |
4
kangsheng9527 2020-09-15 13:51:55 +08:00
300 元帮你远程调试保证能找出问题并处理好。。。
|
7
JustDoIt221 2020-09-15 14:14:10 +08:00
共享内存可见性问题
|
8
swqslwl OP @JustDoIt221 懂了懂了,太菜了,太久不写并发居然忘了这茬
|