Golang之sync.Pool對(duì)象池對(duì)象重用機(jī)制總結(jié)
sync.Pool作用
對(duì)象重用機(jī)制,為了減少GC,sync.Pool是可伸縮的,并發(fā)安全的
兩個(gè)結(jié)構(gòu)體
type Pool struct { local unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal localSize uintptr // size of the local array // New optionally specifies a function to generate // a value when Get would otherwise return nil. // It may not be changed concurrently with calls to Get. New func() interface{} } // Local per-P Pool appendix. type poolLocal struct { private interface{} // Can be used only by the respective P. shared []interface{} // Can be used by any P. Mutex // Protects shared. pad [128]byte // Prevents false sharing. }
Pool是提供外部使用的對(duì)象,Pool有兩個(gè)重要的成員,local是一個(gè)poolLocal數(shù)組,localSize是工作線(xiàn)程的數(shù)量( runtime.GOMAXPROCS(0)),Pool為每個(gè)線(xiàn)程分配一個(gè)poolLocal對(duì)象
寫(xiě)入和讀取
- Pool.Get 先獲取當(dāng)前線(xiàn)程私有值(poolLocal.private)獲取
否則則從共享列表(poolLocal.shared)獲取
否則則從其他線(xiàn)程的共享列表獲取
否則直接通過(guò)New()分配一個(gè)返回值 - Pool.Put 當(dāng)前線(xiàn)程私有制為空,賦值給私有值
否則追加到共享列表
sync.Pool注意點(diǎn)
臨時(shí)性,當(dāng)發(fā)生GC時(shí),Pool的對(duì)象會(huì)被清除,并且不會(huì)有通知
無(wú)狀態(tài),當(dāng)前線(xiàn)程中的PoolLocal.shared的對(duì)象可能會(huì)被其他線(xiàn)程偷走
大規(guī)模Goroutine的瓶頸
會(huì)對(duì)垃圾回收(gc)造成負(fù)擔(dān),需要頻繁的釋放內(nèi)存
雖然goroutine只分配2KB,但是大量gorotine會(huì)消耗完內(nèi)存,并且gc也是goroutine調(diào)用的
原理和作用
原理類(lèi)似是IO多路復(fù)用,就是盡可能復(fù)用,池化的核心優(yōu)勢(shì)就在于對(duì)goroutine的復(fù)用。此舉首先極大減輕了runtime調(diào)度goroutine的壓力,其次,便是降低了對(duì)內(nèi)存的消耗
到此這篇關(guān)于Golang之sync.Pool對(duì)象池對(duì)象重用機(jī)制總結(jié)的文章就介紹到這了,更多相關(guān)Golang sync.Pool對(duì)象重用機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)Mongo數(shù)據(jù)庫(kù)增刪改查操作
本文主要介紹了Golang實(shí)現(xiàn)Mongo數(shù)據(jù)庫(kù)增刪改查操作,我們使用了 MongoDB的官方Go驅(qū)動(dòng)程序,實(shí)現(xiàn)了插入、查詢(xún)、更新和刪除操作,感興趣的可以了解一下2024-01-01Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式
這篇文章主要介紹了Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Go語(yǔ)言中切片(slice)和數(shù)組(array)的區(qū)別詳解
Go語(yǔ)言中切片(slice)和數(shù)組(array)是兩種不同的數(shù)據(jù)結(jié)構(gòu),它們?cè)谟梅ê托袨樯嫌幸恍┲匾獏^(qū)別,所以本文就通過(guò)一些代碼示例給大家詳細(xì)的介紹一下Go語(yǔ)言中切片(slice)和數(shù)組(array)的區(qū)別,需要的朋友可以參考下2023-09-09使用Go語(yǔ)言實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求并給GET添加參數(shù)
在開(kāi)發(fā)Web應(yīng)用程序時(shí),我們經(jīng)常需要向服務(wù)器發(fā)送HTTP請(qǐng)求,本文將介紹一下使用Go語(yǔ)言發(fā)送HTTP請(qǐng)求,并給GET請(qǐng)求添加參數(shù)的方法,感興趣的小伙伴可以了解一下2023-07-07Go-家庭收支記賬軟件項(xiàng)目實(shí)現(xiàn)
這篇文章主要介紹了Go-家庭收支記賬軟件項(xiàng)目實(shí)現(xiàn),本文章內(nèi)容詳細(xì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,需要的朋友可以參考下2023-01-01go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了go使用consul實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及配置共享實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Go語(yǔ)言error的設(shè)計(jì)理念及背景演化詳解
這篇文章主要為大家介紹了Go語(yǔ)言error的設(shè)計(jì)理念及背景演化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12通過(guò)函數(shù)如何將golang?float64?保留2位小數(shù)(方法匯總)
這篇文章主要介紹了通過(guò)函數(shù)將golang?float64保留2位小數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08