- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个网关服务器,它可以使用 websocket 将消息推送到客户端,一个新的客户端连接到我的服务器,我将生成一个 cid
为了它。然后我还订阅了一个 channel ,使用 cid
.如果有任何消息发布到该 channel ,我的服务器会将其推送到客户端。现在,所有单元都工作正常,但是当我尝试通过 thor 进行基准测试时,它会崩溃,我罚款 DeliverMessage
有一些问题,它永远不会退出,因为它有一个死循环。但由于redis需要订阅一些东西,我不知道如何避免循环。
func (h *Hub) DeliverMessage(pool *redis.Pool) {
conn := pool.Get()
defer conn.Close()
var gPubSubConn *redis.PubSubConn
gPubSubConn = &redis.PubSubConn{Conn: conn}
defer gPubSubConn.Close()
for {
switch v := gPubSubConn.Receive().(type) {
case redis.Message:
// fmt.Printf("Channel=%q | Data=%s\n", v.Channel, string(v.Data))
h.Push(string(v.Data))
case redis.Subscription:
fmt.Printf("Subscription message: %s : %s %d\n", v.Channel, v.Kind, v.Count)
case error:
fmt.Println("Error pub/sub, delivery has stopped", v)
panic("Error pub/sub")
}
}
}
在主函数中,我将上面的函数调用为:
go h.DeliverMessage(pool)
但是当我用巨大的连接测试它时,它会给我一些错误,比如:
ERR max number of clients reached
因此,我通过更改 MaxIdle
来更改 redis 池大小:
func newPool(addr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 5000,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) { return redis.Dial("tcp", addr) },
}
}
但它仍然不起作用,所以我想知道,在我的 websocket 在以下选择中断开与我的服务器的连接后,是否有任何好的方法可以杀死 goroutine:
case client := <-h.Unregister:
if _, ok := h.Clients[client]; ok {
delete(h.Clients, client)
delete(h.Connections, client.CID)
close(client.Send)
if err := gPubSubConn.Unsubscribe(client.CID); err != nil {
panic(err)
}
// TODO kill subscribe goroutine if don't client-side disconnected ...
}
但是我如何识别这个 goroutine?我该怎么做unix
方法。 kill -9 <PID>
?
最佳答案
看例子here
一旦您没有收到更多信息,您可以通过在 DeliverMessage 的 switch case 中使用 return 语句来退出 goroutine。我猜 case error
,或者如示例中所示,case 0
你想从那里返回,你的 goroutine 将取消。或者如果我误解了事情,并且case client := <-h.Unregister:
在 DeliverMessage 里面,直接返回即可。
您还关闭了两次连接。 defer gPubSubConn.Close()
只需调用 conn.Close() 所以你不需要 defer conn.Close()
另请查看 the Pool并查看所有参数的实际作用。如果要处理很多连接,请将 MaxActive 设置为 0 “当为零时,池中的连接数没有限制。” (你真的想要空闲超时吗?)
关于go - 如何在golang中释放一个websocket和redis网关服务器资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55646243/
我是一名优秀的程序员,十分优秀!