Go的sync.Pool(五)
生活随笔
收集整理的這篇文章主要介紹了
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(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商信用卡不能分期原因
- 下一篇: 信用卡取现最迟多久还