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>