请教一个 GO websocket goroutine 无限增长问题
使用Go 写了一个websocket 广播服务,通过pprof工具查看,发现每次刷新客户端链接,goroutine数量都会增长,请知道的大佬指点一下,这是啥问题,如何限制
服务端 server.go
package main
import (
"fmt"
"golang.org/x/net/websocket"
"net/http"
_ "net/http/pprof"
"time"
)
// 建立连接池,用于广播消息
var conns = make(map[string]*websocket.Conn)
var messageChan = make(chan string, 10)
func main() {
http.Handle("/", websocket.Handler(func(conn *websocket.Conn) {
conns[conn.RemoteAddr().String()] = conn
for {
var reply string
if err := websocket.Message.Receive(conn, &reply); err != nil {
}
// 防止空转
time.Sleep(1 * time.Second)
}
})) // 设置访问的路由
// 广播消息
go BroadMessages(messageChan)
// 开始广播
go SendMessage(messageChan)
http.ListenAndServe(":8080", nil) // 设置监听的端口
}
// SendMessage 1秒钟广播一次
func SendMessage(messages chan string) {
for {
msg := fmt.Sprintf("这里是广播时间:,%d",time.Now().Unix())
messages <- msg
time.Sleep(1 * time.Second)
}
}
// BroadMessages 向所有连接上的乡亲们发广播
func BroadMessages(messages chan string) {
for {
// 不断从通道里读取消息
msg := <-messages
fmt.Println(msg)
// 向所有的乡亲们发消息
for key, conn := range conns {
if err := websocket.Message.Send(conn, msg); err != nil {
delete(conns, key)
}
}
}
}
客户端是使用简单的js链接的websocket服务
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script>
var ws = new WebSocket("ws://127.0.0.1:8080");
ws.onopen = function(evt) {
ws.send("Hello WebSockets!");
};
ws.onmessage = function(evt) {
console.log(evt.data)
};
ws.onclose = function(evt) {
console.log("Connection closed.");
};
</script>
</html>
服务启动后,客户端访问需要痛殴ide启动一个服务代开才可以,go的websocket会检查请求头,检查来源地址才可以链接成功
打开客户端方式e.g.
链接后效果:
go pprof 工具显示(查看方式可以直接打开:http://127.0.0.1:8080/debug/pprof/)
推荐文章: