sync.Pool 资源池

本文深入探讨了Go语言中sync.Pool的使用与原理,sync.Pool是一个可以分别存取的临时对象集合,旨在缓存未使用的对象以供后续重用,减轻GC压力。文章详细解释了sync.Pool的Get和Put方法,以及如何通过New参数指定对象生成,适用于多线程环境下的内存管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sync.Pool

type Pool struct {
    // 可选参数New指定一个函数在Get方法可能返回nil时来生成一个值
    // 该参数不能在调用Get方法时被修改
    New func() interface{}
    // 包含隐藏或非导出字段
}
func (p *Pool) Get() interface{}
// Get方法从池中选择任意一个item,删除其在池中的引用计数,并提供给调用者。Get方法也可能选择无视内存池,将其当作空的。调用者不应认为Get的返回这和传递给Put的值之间有任何关系。假使Get方法没有取得item:如p.New非nil,Get返回调用p.New的结果;否则返回nil。
func (p *Pool) Put(x interface{})
//Put方法将x放入池中。
  1. Pool是一个可以分别存取的临时对象的集合。
  2. Pool中保存的任何item都可能随时不做通告的释放掉。如果Pool持有该对象的唯一引用,这个item就可能被回收。
  3. Pool可以安全的被多个线程同时使用。
  4. Pool的目的是缓存申请但未使用的item用于之后的重用,以减轻GC的压力。也就是说,让创建高效而线程安全的空闲列表更容易。但Pool并不适用于所有空闲列表。5 .
  5. Pool的合理用法是用于管理一组静静的被多个独立并发线程共享并可能重用的临时item。Pool提供了让多个线程分摊内存申请消耗的方法。
  6. Pool的一个好例子在fmt包里。该Pool维护一个动态大小的临时输出缓存仓库。该仓库会在过载(许多线程活跃的打印时)增大,在沉寂时缩小。
  7. 另一方面,管理着短寿命对象的空闲列表不适合使用Pool,因为这种情况下内存申请消耗不能很好的分配。这时应该由这些对象自己实现空闲列表。

    Pool是一个结构体,有一个字段func,需要一个func() interface{}的函数的值。Get方法会从Pool中删除掉一个item,并返回。

Go语言中文网API
Go语言实战笔记(十六)| Go 并发示例-Pool

转载于:https://www.cnblogs.com/linyihai/p/10295411.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值