golang有用的库及工具 之 sync.Pool改造

来源:互联网 发布:linux 复制重命名 编辑:程序博客网 时间:2024/05/05 14:45
一个sync.Pool对象就是一组临时对象的集合。Pool是协程安全的。

Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力。


如下是使用的两种方式:

一:

func main() {   for index := 0; index < 100; index++ {      go sss()      //go ssse()   }   time.Sleep(2 * time.Second)}var sp = &sync.Pool{}func sss() {   sin := sp.Get()   var buf *bytes.Buffer   if sin != nil {      buf = sin.(*bytes.Buffer)   } else {      buf = bytes.NewBuffer(make([]byte, 0, 65536))   }   buf.Write([]byte("hello world"))   fmt.Println(buf.String())   buf.Reset()   sp.Put(buf)}


二:

package collectionimport (   "bytes"   "sync")type BufferPool struct {   sync.Pool}func NewBufferPool(bufferSize int) (bp *BufferPool) {   return &BufferPool{      sync.Pool{         New: func() interface{} {            return bytes.NewBuffer(make([]byte, 0, bufferSize))         },      },   }}func (bp *BufferPool) Get() *bytes.Buffer {   return bp.Pool.Get().(*bytes.Buffer)}func (bp *BufferPool) Put(b *bytes.Buffer) {   b.Reset()   bp.Pool.Put(b)}


var buffers = collection.NewBufferPool(65536)func main() {   for index := 0; index < 100; index++ {      go sss()      //go ssse()   }   time.Sleep(2 * time.Second)}func ssse() {   buf := buffers.Get()   buf.Write([]byte("hello world"))   fmt.Println(buf.String())   buffers.Put(buf)}

第二种采用了实现其 sync.Pool  的 new 接口,使用起来更加的方便快捷。


总结:sync.Pool的定位不是做类似连接池的东西,它的用途仅仅是增加对象重用的几率,减少gc的负担,从而减少内存开销。



原创粉丝点击