Object Pool Pattern

本文讨论了 Object Pool Pattern 对象池模式的 Go 实现

Object Pool Pattern 对象池

  • 适用于当初始化一个对象实例比维护一个对象实例的开销更大的情形
  • 由于对象是预先初始化的,它对性能有积极的影响
  • 如果不是稳定的需求且需求会出现峰值,则需要进行维护的开销可能会超过了对象池的好处。

对象池实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package pool

type Pool chan *Object

func New(total int) *Pool {
p := make(Pool, total)

for i := 0; i < total; i++ {
o := new(Object)
o.id = i
p <- o
}

return &p
}
1
2
3
4
5
6
7
8
9
10
11
package pool

import "fmt"

type Object struct {
id int
}

func (o *Object) Do(s string) {
fmt.Printf("ID = %d, Object Do %s\n", o.id, s)
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {
p := pool.New(4)

for{
select {
case obj := <- *p :
time.Sleep(time.Second * 1)
obj.Do("Hello")
*p <- obj
default:
return
}
}
}