国外网站 图片,南京网站外包,wordpress dux 1.5,网站建设与维护的试题卷判断题其实GO语言从1.6版本开始非常不错了#xff0c;GC性能优化非常到位#xff0c;并且各种并行设计比从新实现一套C版本的确是方便不少。 语言包也很多#xff0c;库也相对稳定#xff0c;完全可以适用于生产环境。 本文主要是给刚刚入门新手注意一个携程空跑的问题#xff0…其实GO语言从1.6版本开始非常不错了GC性能优化非常到位并且各种并行设计比从新实现一套C版本的确是方便不少。 语言包也很多库也相对稳定完全可以适用于生产环境。 本文主要是给刚刚入门新手注意一个携程空跑的问题因为这种问题可能在C中也遇到过只是一些代码书写习惯导致。 首先来看一段代码 func (c *WSConn) processHandler() {for {select {case message, ok : -c.processMsg: // 处理数据包if !ok {break}Call(message.MsgHead.Id, c, message.MsgContext, int(message.MsgHead.Msglen))}}
}以上代码是用于处理一个WEBSOCKET的二进制消息后转换为指定处理信息的行为。 但是有没有同学发现有什么问题但是这段代码的确有问题因为当连接销毁后会导致processHandler这个携程空跑CPU完全占满当你有多个连接出现这种问题后整台服务器就会爆掉。 首先processMsg是一个channel这里如果连接关闭了会同时关闭掉这个channel首先我们知道select本身会等待channel这样是不会消耗CPU的就像C中的select函数一样本身是不消耗的使用不当的略过。 但是当channel关闭后整个携程本因直接销毁但是代码中的break导致select无限循环跑程序出现空跑现象这里的break是相对于select而言的所以看上去没毛病可跑起来毛病很大。 所以如果当出现空跑或GO语言某个携程CPU激增可以去查看是不是哪个channel和select在无限循环。 所以正确的代码是 func (c *WSConn) processHandler() {for {select {case message, ok : -c.processMsg: // 处理数据包if !ok {return // 这里必须强制结束携程}Call(message.MsgHead.Id, c, message.MsgContext, int(message.MsgHead.Msglen))}}
} 我的排错方法是使用http的一种性能分析方式 下面是详细代码 main.go package mainimport (logruntimenet/http // http包引入_ net/http/pprof // 性能分析包引入)func main() {// 设置并行运行runtime.GOMAXPROCS(2)logger.SetLogName(testserver.log)go func() {log.Println(http.ListenAndServe(localhost:6060, nil))}() // 此处建立http专用的性能分析端口webSock : knlWebsocket.Create(:88, null)webSock.Listen()}以上代码仅供抛砖引玉无法通过编译注意注释内的代码。 看代码很简单import 2个包 import (net/http // http包引入_ net/http/pprof // 性能分析包引入) 然后main函数中加入代码 go func() {log.Println(http.ListenAndServe(localhost:6060, nil))}() // 此处建立http专用的性能分析端口我在这里加入了一个携程来做性能分析是因为我本身有自己的主处理逻辑所以必须使用携程。 完成以上代码添加后直接编译启动程序访问地址http://localhost:6060/debug/pprof/然后就可以进行愉快的性能分析了 转载于:https://www.cnblogs.com/koangel/p/6219308.html