使用 websocket 发送数据给前端过段时间后后端程序卡死

2020-09-15 11:20:37 +08:00
 swqslwl

后端程序启动后 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
			}
		}
	}
}
1747 次点击
所在节点    Go 编程语言
8 条回复
ghjacky
2020-09-15 12:17:14 +08:00
for 这样用合适吗,为啥不把 dataTmp 换成 channel 呢,for 配合 select 读 dataTmp 不好吗
swqslwl
2020-09-15 13:18:38 +08:00
@ghjacky 不是很好,但感觉问题不是出在这
back0893
2020-09-15 13:28:53 +08:00
dataTmp 的问题吧.
一般来说你写的 loop 数据应该是隔离的,就算要共性,也需要加锁
kangsheng9527
2020-09-15 13:51:55 +08:00
300 元帮你远程调试保证能找出问题并处理好。。。
swqslwl
2020-09-15 14:06:42 +08:00
@ghjacky 老哥我错了,就是没用 channel 的问题。
swqslwl
2020-09-15 14:09:22 +08:00
@back0893 是的是的,换了管道就好了。老哥可以详细说说这里使用切片和管道的区别吗?
JustDoIt221
2020-09-15 14:14:10 +08:00
共享内存可见性问题
swqslwl
2020-09-15 14:21:03 +08:00
@JustDoIt221 懂了懂了,太菜了,太久不写并发居然忘了这茬

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/707111

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX