Chlins' Blog

Hi, nice to meet you.

  1. 1. sync.Pool

sync.Pool

这是在golang1.3版本的时候新加入标准包sync里面的一个新特性,目的就是提供一个通用的对象池,复用临时对象,减少GC的压力,并且保证pool中的资源时协程安全的。

pool的用法也十分的简单,操作的话其实只有两个方法,分别是PutGet,语义是放入资源和取出资源。

1
2
3
4
5
6
7
8
9
10
package main

import "fmt"
import "sync"

func main() {
var pool sync.Pool

fmt.Println(pool.Get())
}

此时我们得到的结果是<nil>,是因为在声明pool的时候我们没有给它设置初始化资源的方法New func() interface{},现在我们声明一个方法

1
2
3
4
func main() {
pool := &sync.Pool{New: func() interface{}{return "hello"}}
fmt.Println(pool.Get())
}

此时我们得到的输出就是hello了,假设我们再次Get,此时会得到还是hello,那是因为我们传递的New方法就是返回一个hello对象,当pool中没有对象了,就会调用New分配一个资源出来,假设pool中有资源,还是会优先返回其中的资源,如下:

1
2
3
4
5
6
func main() {
pool := &sync.Pool{New: func() interface{}{return "hello"}}
pool.Put("world")
fmt.Println(pool.Get())
fmt.Println(pool.Get())
}

此时首先打印world再打印hello

最后在使用pool的时候同样也有一些注意点,如果不注意就会踩坑(😭)

注意:

  • 放入pool中的对象,并不会一直等待被Get,每过一段时间就会被GC回收,(所以千万不要把pool当成cache用!!!)

  • pool的应用场景主要是一些临时的状态无关的数据,所以一些有状态的数据并不适合存储在其中(例如数据库连接等)

本文最后更新于 天前,文中所描述的信息可能已发生改变