Go的sync.Pool(五)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/fujian9544/article/details/100538263

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 main
 
import (
	"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())
	// 再取就没有了,会自动调用NEW
	log.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>

猜你喜欢

转载自blog.csdn.net/fujian9544/article/details/100538263