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


本文摘自网络,作者,侵删。

sync.Pool作用

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

两个结构体

  1. type Pool struct {

  2.    local     unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal

  3.    localSize uintptr        // size of the local array


  4.    // New optionally specifies a function to generate

  5.    // a value when Get would otherwise return nil.

  6.    // It may not be changed concurrently with calls to Get.

  7.    New func() interface{}

  8. }


  9. // Local per-P Pool appendix.

  10. type poolLocal struct {

  11.    private interface{}   // Can be used only by the respective P.

  12.    shared  []interface{} // Can be used by any P.

  13.    Mutex                 // Protects shared.

  14.    pad     [128]byte     // Prevents false sharing.

  15. }

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的压力,其次,便是降低了对内存的消耗
图片



本文来自:51CTO博客

感谢作者:mb6066e504cce6f

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

相关阅读 >>

Golang语言社区】四川麻将随机初始化牌型结构

Golang escape analyze

手撸Golang etcd raft协议之2

Go语言基础之反射

dbatool-dodba

详解Go 中方法与函数的区别

Golang-2(变量)

Go语言获取系统性能数据Gopsutil库

Golang入门四:流程控制

Go语言学习6-字典类型

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...