日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【原创】请避免GO语言中的携程空跑(CPU突然激增)

發布時間:2023/12/9 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【原创】请避免GO语言中的携程空跑(CPU突然激增) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

其實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 ("log""runtime""net/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

總結

以上是生活随笔為你收集整理的【原创】请避免GO语言中的携程空跑(CPU突然激增)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。