Pool模式是一种创建和提供可供使用的固定数量实例或Pool实例的方法。它通常用于约束创建昂贵的场景,如数据库连接,以便只创建固定数量的实例,但不确定数量的操作任然可以请求访问这些场景。对于Go语言的sync.Pool,这种数据类型可以被多个goroutine安全地使用。
下面是一个简单的例子。
package main
import (
"fmt"
"sync"
)
func main() {
var numCalcsCreate int
calcPool := &sync.Pool {
New: func() interface{} {
numCalcsCreate += 1
mem := make([]byte, 1024)
return &mem
},
}
//用4kb初始化Pool
calcPool.Put(calcPool.New())
calcPool.Put(calcPool.New())
calcPool.Put(calcPool.New())
calcPool.Put(calcPool.New())
const numWorkers = 1024*1024
var wg sync.WaitGroup
wg.Add(numWorkers)
for i := numWorkers; i > 0; i-- {
go func() {
defer wg.Done()
mem := calcPool.Get().(*[]byte)
defer calcPool.Put(mem)
// 某些操作
}()
}
wg.Wait()
fmt.Printf("%d calculators were created.", numCalcsCreate)
}
输出:
6 calculators were created.