最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go編程庫Sync.Pool用法示例詳解

 更新時(shí)間:2022年12月15日 11:29:48   作者:小馬別過河  
這篇文章主要為大家介紹了Go編程庫Sync.Pool用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

場景

go 如果頻繁地創(chuàng)建、銷毀對象(比如 http 服務(wù)的 json 對象,日志內(nèi)容等),會對 GC 造成壓力。比如下面的 Log 函數(shù),在高并發(fā)情況下,需要頻繁地創(chuàng)建和銷毀 buffer。

func Log(w io.Writer, key, val string) {
	b := new(bytes.Buffer)
  // 按一定的格式打印日志,這一段不是重點(diǎn)
	b.WriteString(time.Now().UTC().Format(time.RFC3339))
	b.WriteByte(' ')
	b.WriteString(key)
	b.WriteByte('=')
	b.WriteString(val)
	b.WriteByte('\n')
	w.Write(b.Bytes())
}

這時(shí)候可以考慮復(fù)用這些 buffer。我們可以維護(hù)一個(gè) buffer 的對象池,需要的時(shí)候從對象池拿 buffer,用完放回對象池。這時(shí)候就推薦使用 sync.Pool 了。

sync.Pool 維護(hù)著一組對象池,需要時(shí)從對象池拿對象,不需要放回對象池就可以了。它有這些特點(diǎn):

  • 忙時(shí)會自動擴(kuò)容對象池,閑時(shí)會自動縮容;
  • 線程安全;
  • 對象池的對象,會未經(jīng)通知地自動刪除;
  • 不能被 copy。

用法

創(chuàng)建

初始化時(shí)指定 New 方法。sync.Pool 會通過 New 方法創(chuàng)建對象池的對象。一般返回一個(gè)指針。

// 從對象池里取 buffer 時(shí),如果池里沒 buffer了,則調(diào)用 New 創(chuàng)建一個(gè)新的。
var bufPool = sync.Pool{
	New: func() interface{} {
		return new(bytes.Buffer)
	},
}

GET & PUT

通過 Get 獲取對象池的對象。當(dāng)使用完畢,通過 Put 把對象返回對象池。

  b := bufPool.Get().(*bytes.Buffer)  // 從對象池拿 buffer 對象
  // 操作對象,這個(gè)不重要
	b.Reset()
	b.WriteString(time.Now().UTC().Format(time.RFC3339))
  // 操作完放回對象池
	bufPool.Put(b)

優(yōu)化 Log 函數(shù)

Log 函數(shù)可以使用 sync.Pool 的優(yōu)化,代碼如下:

var bufPool = sync.Pool{
	New: func() interface{} {
		return new(bytes.Buffer)
	},
}
func LogWithPool(w io.Writer, key, val string) {
  // 從對象池拿 buffer 
	b := bufPool.Get().(*bytes.Buffer)
	b.Reset()
  // 按一定的格式打印日志,這一段不是重點(diǎn)
	b.WriteString(time.Now().UTC().Format(time.RFC3339))
	b.WriteByte(' ')
	b.WriteString(key)
	b.WriteByte('=')
	b.WriteString(val)
	b.WriteByte('\n')
	w.Write(b.Bytes())
  // 放回對象池
	bufPool.Put(b)
}

性能測試

我們對兩個(gè)函數(shù)進(jìn)行性能測試

// 不使用 sync.Pool
func BenchmarkLog(b *testing.B) {
	writer := os.NewFile(0, os.DevNull)
	for n := 0; n < b.N; n++ {
		Log(writer, "path", "/search?a=flowers")
	}
}
// 使用 sync.Pool 復(fù)用
func BenchmarkLogWithPool(b *testing.B) {
	writer := os.NewFile(0, os.DevNull)
	for n := 0; n < b.N; n++ {
		LogWithPool(writer, "path", "/search?a=flowers")
	}
}

結(jié)果:

> go test -bench . -benchmem
goos: darwin
goarch: amd64
pkg: example/pool
cpu: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
BenchmarkLog-8                   1849365               635.0 ns/op           112 B/op          2 allocs/op
BenchmarkLogWithPool-8           1993304               614.4 ns/op            48 B/op          1 allocs/op
PASS
ok      example/pool    4.333s

相比之下,使用 Sync.Pool 和不使用的時(shí)候,內(nèi)存的使用比為 48:112,優(yōu)化效果還是挺明顯的。

參考:

[1]. pkg.go.dev/sync#Pool

以上就是Go編程庫Sync.Pool用法示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go庫Sync.Pool的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語言入門環(huán)境搭建及GoLand安裝教程詳解

    go語言入門環(huán)境搭建及GoLand安裝教程詳解

    這篇文章主要介紹了go語言入門環(huán)境搭建及GoLand安裝教程詳解,需要的朋友可以參考下
    2020-12-12
  • Go 如何使用原始套接字捕獲網(wǎng)卡流量

    Go 如何使用原始套接字捕獲網(wǎng)卡流量

    為了減少對環(huán)境的依賴可以使用原始套接字捕獲網(wǎng)卡流量,然后使用?gopacket?的協(xié)議解析功能,這樣就省去了解析這部分的工作量,正確性也可以得到保證,同時(shí) CGO 也可以關(guān)閉,這篇文章主要介紹了Go 使用原始套接字捕獲網(wǎng)卡流量,需要的朋友可以參考下
    2024-07-07
  • golang反向代理設(shè)置host不生效的問題解決

    golang反向代理設(shè)置host不生效的問題解決

    在使用golang的httputil做反向代理的時(shí)候,發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,上游網(wǎng)關(guān)必須要設(shè)置host才行,不設(shè)置host的話,golang服務(wù)反向代理請求下游會出現(xiàn)http 503錯(cuò)誤,接下來通過本文給大家介紹golang反向代理設(shè)置host不生效問題,感興趣的朋友一起看看吧
    2023-05-05
  • Go語言編程中對文件讀寫的基本方法整理

    Go語言編程中對文件讀寫的基本方法整理

    這篇文章主要介紹了Go語言編程中對文件讀寫的基本方法整理,是Go語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • 淺析Go語言中的方法集合與選擇receiver類型

    淺析Go語言中的方法集合與選擇receiver類型

    這篇文章主要為大家詳細(xì)介紹了Go語言中的方法集合與選擇receiver類型的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們深入學(xué)習(xí)go語言有一定的幫助,需要的可以參考下
    2023-11-11
  • GO語言中的常量

    GO語言中的常量

    go語言支持的常量有字符型,字符串型,布爾型和數(shù)字型。本文實(shí)例講述了Go語言中常量定義方法。分享給大家供大家參考。
    2015-04-04
  • Go語言中樂觀鎖與悲觀鎖的具體使用

    Go語言中樂觀鎖與悲觀鎖的具體使用

    樂觀鎖和悲觀鎖是兩種思想,用于解決并發(fā)場景下的數(shù)據(jù)競爭問題,本文主要介紹了Go語言中樂觀鎖與悲觀鎖的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 一些關(guān)于Go程序錯(cuò)誤處理的相關(guān)建議

    一些關(guān)于Go程序錯(cuò)誤處理的相關(guān)建議

    錯(cuò)誤處理在每個(gè)語言中都是一項(xiàng)重要內(nèi)容,眾所周知,通常寫程序時(shí)遇到的分為異常與錯(cuò)誤兩種,Golang中也不例外,這篇文章主要給大家介紹了一些關(guān)于Go程序錯(cuò)誤處理的相關(guān)建議,需要的朋友可以參考下
    2021-09-09
  • 詳解Golang中Context的原理和使用技巧

    詳解Golang中Context的原理和使用技巧

    Golang?的?Context?包,中文可以稱之為“上下文”,是用來在?goroutine?協(xié)程之間進(jìn)行上下文信息傳遞的,這些上下文信息包括?kv?數(shù)據(jù)、取消信號、超時(shí)時(shí)間、截止時(shí)間等。本文主要介紹了Context的原理和使用技巧,希望對大家有所幫助
    2022-11-11
  • Golang實(shí)現(xiàn)對map的并發(fā)讀寫的方法示例

    Golang實(shí)現(xiàn)對map的并發(fā)讀寫的方法示例

    這篇文章主要介紹了Golang實(shí)現(xiàn)對map的并發(fā)讀寫的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03

最新評論

高邮市| 巴林左旗| 隆化县| 昌都县| 江都市| 肥东县| 永登县| 临颍县| 永州市| 长沙县| 布拖县| 江永县| 衡山县| 常熟市| 永修县| 赣州市| 新干县| 兰西县| 重庆市| 象州县| 修武县| 宝山区| 甘泉县| 开江县| 九台市| 通渭县| 衡阳市| 宽甸| 资阳市| 德惠市| 福贡县| 连江县| 丰原市| 余干县| 三河市| 泰兴市| 花垣县| 青海省| 岳池县| 永仁县| 古交市|