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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Go的sync.Pool(五)

發布時間:2024/9/19 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go的sync.Pool(五) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Pool

作用

sync.Pool的作用是存儲那些被分配了但是沒有被使用,而未來可能會使用的值,以減小垃圾回收的壓力,Pool不太適合做永久保存的池,更適合做臨時對象池。在Go語言的程序設計中,這是為了緩解高并發是垃圾回收的壓力。在并發程序中,sync.Pool會維持一個channel隊列,這個隊列中的資源的個數是不固定的,并發的goroutine可在該隊列中獲取資源

有兩個需要注意的要點:

一定要定義初始化函數(New()),否則如果Pool是空的話,會返回nil。

返回機制

pool,說白了就是一個對象池,這個類設計的目的是用來保存和復用臨時對象,以減少內存分配,降低CG壓力。

Get返回Pool中的任意一個對象。

如果Pool為空,則調用New返回一個新創建的對象。

如果沒有設置New,則返回nil。

回收機制

放進Pool中的對象,會在說不準什么時候被回收掉。

所以如果事先Put進去100個對象,下次Get的時候發現Pool是空也是有可能的。

不過這個特性的一個好處就在于不用擔心Pool會一直增長,因為Go已經幫你在Pool中做了回收機制。這個清理過程是在每次垃圾回收之前做的。垃圾回收是固定兩分鐘觸發一次,而且每次清理會將Pool中的所有對象都清理掉!

package mainimport ("log""sync" )// pool就是一個中間件 // put放入 // get取出 // New為默認func main(){// 建立對象// var pipe = sync.Pool{// New:func()interface{}{// var a string// a="aaaaaa"// return &a// },// }var pipe = &sync.Pool{New: func() interface{} {var mapp map[string]float32;mapp = make(map[string]float32);mapp["name"]=11.11;return mapp},}// 準備放入的字符串val := "Hello,World!"// 放入pipe.Put(val)// 取出log.Println(pipe.Get())// 再取就沒有了,會自動調用NEWlog.Println(pipe.Get()) } // 有new的時候 // 2018/12/29 17:50:10 Hello,World! // 2018/12/29 17:50:11 Hello,BeiJing// 沒有new的時候 // 2019/09/03 19:40:11 Hello,World! // 2019/09/03 19:40:11 <nil>

總結

以上是生活随笔為你收集整理的Go的sync.Pool(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

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