Go的sync.Pool(五)
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(五)相关推荐
- golang的临时对象池sync.Pool
今天在写码之时,发现了同事用到了sync.pool.因不知其因,遂Google之.虽然大概知道其原因和用法.还不能融汇贯通.故写此记,方便日后查阅.直至明了. 正文 在高并发或者大量的数据请求的场景中 ...
- [译] Go: 理解 Sync.Pool 的设计
原文地址:medium.com/@blanchon.v- 原文作者:Vincent Blanchon 译文地址:github.com/watermelo/d- 译者:咔叽咔叽 译者水平有限,如有翻译或 ...
- 深度解密Go语言之sync.pool
最近在工作中碰到了 GC 的问题:项目中大量重复地创建许多对象,造成 GC 的工作量巨大,CPU 频繁掉底.准备使用 sync.Pool 来缓存对象,减轻 GC 的消耗.为了用起来更顺畅,我特地研究了 ...
- [转载]golang sync.Pool
2019独角兽企业重金招聘Python工程师标准>>> Go 1.3 的sync包中加入一个新特性:Pool. 官方文档可以看这里http://golang.org/pkg/sync ...
- Golang sync.pool对象池
概览 Goalng中通过sync.pool提供了对象池的实现来达到对象复用的目的.在netty中,也通过Recycle类实现了类似的对象池实现.在netty的对象池Recycle中,当A线程需要将B线 ...
- 深入Golang之sync.Pool详解
转载地址:https://www.cnblogs.com/sunsky303/p/9706210.html 我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用 ...
- Go 并发编程 — 深入浅出 sync.Pool ,最全的使用姿势,最深刻的原理
大纲 使用姿势 初始化 Pool 实例 New 申请对象 Get 释放对象 Put 思考 为什么用 Pool,而不是在运行的时候直接实例化对象呢? sync.Pool 是并发安全的吗? 为什么 syn ...
- 手摸手Go 深入剖析sync.Pool
作者 | Leo叔叔 责编 | 欧阳姝黎 如果能够将所有内存都分配到栈上无疑性能是最佳的,但不幸的是我们不可避免需要使用堆上分配的内存.我们可以优化使用堆内存时的性能损耗吗?答案是肯定的. ...
- Golang sync.Pool 简介与用法
文章目录 1.简介 2.应用 2.1 标准库的应用 2.2 复用 bytes.Buffer 参考文章 1.简介 Pool 是可伸缩.并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象 ...
最新文章
- 如何用JavaScript的回调函数做出承诺
- @value注解_Java系列之注解
- OpenStack管理界面开源啦!
- 倒序查10条数据_10 | 怎么给字符串字段加索引?
- SolidWorks转3DMAX
- 米斯特白帽培训讲义 工具篇 AWVS
- 限制码率的视频编码标准比较(包括MPEG-2,H.263, MPEG-4,以及 H.264)
- CSS:position属性和z_index
- 如果你知道10条以上,你就和我一样渊博了
- 机器学习 深度学习 ai_人工智能,机器学习和深度学习。 真正的区别是什么?...
- 冒泡排序(java代码实现)
- 关于mybatis整合spring时报java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/Trasactionwar
- python concat_python数据拼接: pd.concat
- 为了革命 保护眼睛 !—— 眼科专家配置的色调
- 从 Illustrator 怎么导入 Glyphs?
- Java 代码分享(第4篇),绘制迷宫2 绘制起点终点和路径
- dedecms织梦后台不显示模块管理和辅助插件
- 【Flutter 实战】全局点击空白处隐藏键盘
- 唯美伤感个性日志推荐:有一种美因距离而产生
- 前向逐步线性回归算法
热门文章
- 查看oracle数据库的连接数以及用户 (转:http://blog.itpub.net/24558279/viewspace-752293/)
- 1CCTableView的使用,TableView响应和小格子tableView实现
- 1线程同步:互斥量,死锁
- Spring整合的quartz任务调度的实现方式
- python中面向对象的缺点_最简单的方法搞懂Python面向对象
- python对字典的基本操作(遍历、排序)总结,Python字典操作简明总结
- java中文字符怎么保证出现正确_JAVA中文字符编码问题详解
- java db 程序_JAVA连接数据库的简单程序
- ubuntu 下载mysql8_mysql8.0 ubuntu 安装
- mysql备份与还原-mysqldump备份、mysql与source还原