【golang】语言sync.Pool优化性能资源重复利用
2020-03-14 本文已影响0人
dongzd
使用原因
- 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)
}