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 mainimport ("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())// 再取就没有了,会自动调用NEWlog.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>

Go的sync.Pool(五)相关推荐

  1. golang的临时对象池sync.Pool

    今天在写码之时,发现了同事用到了sync.pool.因不知其因,遂Google之.虽然大概知道其原因和用法.还不能融汇贯通.故写此记,方便日后查阅.直至明了. 正文 在高并发或者大量的数据请求的场景中 ...

  2. [译] Go: 理解 Sync.Pool 的设计

    原文地址:medium.com/@blanchon.v- 原文作者:Vincent Blanchon 译文地址:github.com/watermelo/d- 译者:咔叽咔叽 译者水平有限,如有翻译或 ...

  3. 深度解密Go语言之sync.pool

    最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底.准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗.为了用起来更顺畅,我特地研究了 ...

  4. [转载]golang sync.Pool

    2019独角兽企业重金招聘Python工程师标准>>> Go 1.3 的sync包中加入一个新特性:Pool. 官方文档可以看这里http://golang.org/pkg/sync ...

  5. Golang sync.pool对象池

    概览 Goalng中通过sync.pool提供了对象池的实现来达到对象复用的目的.在netty中,也通过Recycle类实现了类似的对象池实现.在netty的对象池Recycle中,当A线程需要将B线 ...

  6. 深入Golang之sync.Pool详解

    转载地址:https://www.cnblogs.com/sunsky303/p/9706210.html 我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用 ...

  7. Go 并发编程 — 深入浅出 sync.Pool ,最全的使用姿势,最深刻的原理

    大纲 使用姿势 初始化 Pool 实例 New 申请对象 Get 释放对象 Put 思考 为什么用 Pool,而不是在运行的时候直接实例化对象呢? sync.Pool 是并发安全的吗? 为什么 syn ...

  8. 手摸手Go 深入剖析sync.Pool

    作者 | Leo叔叔       责编 | 欧阳姝黎 如果能够将所有内存都分配到栈上无疑性能是最佳的,但不幸的是我们不可避免需要使用堆上分配的内存.我们可以优化使用堆内存时的性能损耗吗?答案是肯定的. ...

  9. Golang sync.Pool 简介与用法

    文章目录 1.简介 2.应用 2.1 标准库的应用 2.2 复用 bytes.Buffer 参考文章 1.简介 Pool 是可伸缩.并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象 ...

最新文章

  1. 如何用JavaScript的回调函数做出承诺
  2. @value注解_Java系列之注解
  3. OpenStack管理界面开源啦!
  4. 倒序查10条数据_10 | 怎么给字符串字段加索引?
  5. SolidWorks转3DMAX
  6. 米斯特白帽培训讲义 工具篇 AWVS
  7. 限制码率的视频编码标准比较(包括MPEG-2,H.263, MPEG-4,以及 H.264)
  8. CSS:position属性和z_index
  9. 如果你知道10条以上,你就和我一样渊博了
  10. 机器学习 深度学习 ai_人工智能,机器学习和深度学习。 真正的区别是什么?...
  11. 冒泡排序(java代码实现)
  12. 关于mybatis整合spring时报java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/Trasactionwar
  13. python concat_python数据拼接: pd.concat
  14. 为了革命 保护眼睛 !—— 眼科专家配置的色调
  15. 从 Illustrator 怎么导入 Glyphs?
  16. Java 代码分享(第4篇),绘制迷宫2 绘制起点终点和路径
  17. dedecms织梦后台不显示模块管理和辅助插件
  18. 【Flutter 实战】全局点击空白处隐藏键盘
  19. 唯美伤感个性日志推荐:有一种美因距离而产生
  20. 前向逐步线性回归算法

热门文章

  1. 查看oracle数据库的连接数以及用户 (转:http://blog.itpub.net/24558279/viewspace-752293/)
  2. 1CCTableView的使用,TableView响应和小格子tableView实现
  3. 1线程同步:互斥量,死锁
  4. Spring整合的quartz任务调度的实现方式
  5. python中面向对象的缺点_最简单的方法搞懂Python面向对象
  6. python对字典的基本操作(遍历、排序)总结,Python字典操作简明总结
  7. java中文字符怎么保证出现正确_JAVA中文字符编码问题详解
  8. java db 程序_JAVA连接数据库的简单程序
  9. ubuntu 下载mysql8_mysql8.0 ubuntu 安装
  10. mysql备份与还原-mysqldump备份、mysql与source还原