美文网首页golang 编程笔记
【golang】语言sync.Pool优化性能资源重复利用

【golang】语言sync.Pool优化性能资源重复利用

作者: dongzd | 来源:发表于2020-03-14 14:35 被阅读0次

使用原因

  • go是自动垃圾回收的,大大减少了程序编程负担。但GC是一把双刃剑,带来方便的同时也增加了运行时开销,使用不当会严重影响程序的性能。
  • 如果将不用的对象存放在一个池子中,用的时候从池子中取出一个对象,用完了再还回去,这样就能减轻gc的压力。
  • 对于池这个概念,之前可能听说过连接池。能否用sync.Pool实现一个连接池呢?答案是不能的。因为对于sync.Pool而言,我们无法保证每次放回去再取出来的对象是与之前一致的,对象的内存存在着呗销毁的可能。因此,这个sync.Pool的存在仅仅是为了减缓gc的压力而生的。

基本实现

import (
    "fmt"
    "sync"
)
type Con Struct{
    User string
}
func main() {
    p := &sync.Pool{
        New: func() interface{} {
            return new(Con)
        },
    }

    s := p.Get().(Con)
    fmt.Println(s)
    s.User = "test"
    p.Put(s)
}

当使用的对象时候,如果没有则会在New里面创建一个,使用完在放入,取出对象里面具体类容,根据不同业务逻辑,设置不同值,当放入pool被另一个程序复用后,会重新设置自己需要的值,都是在重复利用已经给Con分配的内存(new分配内存)

单独封装成文件

var (
    defaultTaskPool = newTaskPool()
)
func newTaskPool() *taskPool {
    return &taskPool{
        New: func() interface{} {
            return &Task{}
        },
    }
}

func (pool *taskPool) get() *Task {
    return pool.Get().(*Task)
}

func (pool *taskPool) put(obj *Task) {
        obj.Reset()
    pool.Put(obj)
}

相关文章

网友评论

    本文标题:【golang】语言sync.Pool优化性能资源重复利用

    本文链接:https://www.haomeiwen.com/subject/gewbshtx.html