這篇文章主要講解了“Go的Pool并發(fā)怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Go的Pool并發(fā)怎么使用”吧!
渝北網(wǎng)站建設公司創(chuàng)新互聯(lián)公司,渝北網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為渝北千余家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\成都外貿網(wǎng)站建設要多少錢,請找那個售后服務好的渝北做網(wǎng)站的公司定做!
sync.Pool 用于存儲臨時對象,它將使用完畢的對象存入對象池中,在需要的時候取出來重復使用,目的是為了避免重復創(chuàng)建相同的對象造成 GC 負擔過重。從 Pool 中取出對象時,如果 Pool 中沒有對象,將返回 nil,但是如果給 Pool.New 字段指定了一個函數(shù)的話,Pool 將使用該函數(shù)創(chuàng)建一個新對象返回。
package mainimport ( "fmt" "sync")func main() { sp := sync.Pool{ //創(chuàng)建一個Pool,并且實現(xiàn)New()函數(shù) New: func() interface{}{ return "hello world" }, } // 第1次獲取池中值 v1 := sp.Get() fmt.Println("第1次值:", v1) //New()返回的是interface{}通過類型斷言來轉換 if v1,ok := v1.(string);ok { v1= "hello golang" sp.Put(v1) // 獲取池子中元素 然后修改值 } // 第2次獲取池中值 v2 := sp.Get() fmt.Println("第2次值:", v2) // 第3次獲取池中值 v3 := sp.Get() //因為池中的對象已經(jīng)沒有了,所以又重新通過New()創(chuàng)建一個新對象,放入池中,然后返回 fmt.Println("第3次值:", v3)}
打印結果
第1次值: hello world第2次值: hello golang第3次值: hello world
嘗試從私有對象獲取
私有對象不存在,嘗試從當前Processor的共享池獲取
如果當前Processor共享池是空的,那么就嘗試去其他Processor的共享池獲取
如果所有子池都是空的,最后就用指定的New 函數(shù)產(chǎn)生一個新的對象返回。
如果私有對象不存在則保存為私有對象
如果私有對象存在,放入當前Processor子池的共享池
GC會清除sync.pool緩存的對象
對象的緩存有效期為下一次GC之前
適用與通過復用,降低復雜對象的創(chuàng)建和GC代價
協(xié)程安全,會有鎖的開銷
生命周期受GC影響,不適用于連接池等,需要自己管理生命周期的資源的池化
感謝各位的閱讀,以上就是“Go的Pool并發(fā)怎么使用”的內容了,經(jīng)過本文的學習后,相信大家對Go的Pool并發(fā)怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!