Golang之sync.Pool对象池对象重用机制总结

wuzhc · · 358 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

文章来源于: https://gobea.cn/blog/detail/VrL2jbol.html

sync.Pool作用

对象重用机制,为了减少GC,sync.Pool是可伸缩的,并发安全的

两个结构体

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是提供外部使用的对象,Pool有两个重要的成员,local是一个poolLocal数组,localSize是工作线程的数量( runtime.GOMAXPROCS(0)),Pool为每个线程分配一个poolLocal对象

写入和读取

  • Pool.Get

    • 先获取当前线程私有值(poolLocal.private)获取
    • 否则则从共享列表(poolLocal.shared)获取
    • 否则则从其他线程的共享列表获取
    • 否则直接通过New()分配一个返回值
  • Pool.Put

    • 当前线程私有制为空,赋值给私有值
    • 否则追加到共享列表

sync.Pool注意点

  • 临时性,当发生GC时,Pool的对象会被清除,并且不会有通知
  • 无状态,当前线程中的PoolLocal.shared的对象可能会被其他线程偷走

大规模Goroutine的瓶颈

  • 会对垃圾回收(gc)造成负担,需要频繁的释放内存
  • 虽然goroutine只分配2KB,但是大量gorotine会消耗完内存,并且gc也是goroutine调用的

原理和作用

原理类似是IO多路复用,就是尽可能复用,池化的核心优势就在于对goroutine的复用。此举首先极大减轻了runtime调度goroutine的压力,其次,便是降低了对内存的消耗
https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d092285de68648779ea5ac84f87f9853~tplv-k3u1fbpfcp-zoom-1.image

参考

更多优质文章请关注

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/64b14b32d97b4a3da33e8ec83bb20565~tplv-k3u1fbpfcp-zoom-1.image


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:wuzhc

查看原文:Golang之sync.Pool对象池对象重用机制总结

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

358 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传