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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Golang sync.Cond 简介与用法
下一篇:Golang sync.WaitGroup 简介与用法

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月21日 00时08分58秒