Golang sync.Pool 简介与用法
发布日期:2021-06-29 19:23:49
浏览次数:2
分类:技术文章
本文共 1346 字,大约阅读时间需要 4 分钟。
Pool 是可伸缩、并发安全的临时对象池,用来存放已经分配但暂时不用的临时对象,通过对象重用机制,缓解 GC 压力,提高程序性能。
一个比较好的例子是 fmt 包,fmt 包总是需要使用一些 []byte 之类的对象,Golang 建立了一个临时对象池,存放着这些对象,如果需要使用一个 []byte,就去 Pool 中取,如果拿不到就分配一个。这比起不停生成新的[]byte,用完了再等待 GC 回收要高效得多。
注意,sync.Pool 是一个临时对象池,适用于储存一些会在 goroutine 间共享的临时对象,其中保存的任何项都可能随时不做通知地释放掉,所以不适合用于存放诸如 socket 长连接或数据库连接的对象。
type Pool struct { // 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{} // contains filtered or unexported fields}// 从 Pool 中获取元素。当 Pool 中没有元素时,会调用 New 生成元素,新元素不会放入 Pool 中。若 New 未定义,则返回 nilfunc (p *Pool) Get() interface{}// 往 Pool 中添加元素 xfunc (p *Pool) Put(x interface{})
代码示例
package mainimport ( "bytes" "io" "os" "sync" "time")var bufPool = sync.Pool { New: func() interface{} { return new(bytes.Buffer) },}func PoolTest(w io.Writer, key, val string) { b, _ := bufPool.Get().(*bytes.Buffer) b.Reset() b.WriteString(time.Now().UTC().Format("2006-01-02 15:04:05")) b.WriteByte('|') b.WriteString(key) b.WriteByte('=') b.WriteString(val) w.Write(b.Bytes()) w.Write([]byte("\n")) bufPool.Put(b)}func main() { PoolTest(os.Stdout, "dablelv", "monkey")}
编译运行结果:
2019-07-12 12:11:47|dablelv=monkey
参考文章
[1]
[2] [3] [4]转载地址:https://dablelv.blog.csdn.net/article/details/95660971 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月21日 00时08分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
VS运行出现This application is currently offline. To enable the application, remove the app_offline.
2021-07-03
datalist控件的DataSourceID与DataSource属性
2021-07-03
GridView的DataSourceID vs. DataSource属性
2021-07-03
asp.net 2.0数据绑定详解
2021-07-03
DataList使用eval方法绑定图片
2021-07-03
Server.MapPath详解(转)
2021-07-03
FileUpload1文件上传
2021-07-03
GridView.DataKeyNames 属性
2021-07-03
Marquee实现文字走马灯滚动效果
2019-04-30
asp.net2.0数据访问工具--DataSource
2019-04-30
asp.net c# SqlDataSource 控件
2019-04-30
使用FileUpload上传文件并向数据库插入一条记录
2019-04-30
类 对象 实例 方法 继承 封装 多态
2019-04-30
类 对象 实例 继承 方法 封装 多态
2019-04-30
c#中类、对象、实例的区别
2019-04-30
什么是 C# 分部类(partia)
2019-04-30
在web.config中配置session的生命周期
2019-04-30
Oracle随机函数
2019-04-30