文章目录
- sync.Pool示例
- sync.Pool数据结构
- TCP连接池
- 总结
- 参考资料
sync.Pool示例
代码
sync.Pool对外提供的New、Get和Put方法。
var buffers = sync.Pool{New: func() interface{} { return new(bytes.Buffer)},
}func GetBuffer() *bytes.Buffer {return buffers.Get().(*bytes.Buffer)
}func PutBuffer(buf *bytes.Buffer) {buf.Reset()buffers.Put(buf)
}
sync.Pool数据结构
sync.Pool 的数据结构如下图所示
TCP连接池
// 工厂模式,提供创建连接的工厂方法
factory := func() (net.Conn, error) { return net.Dial("tcp", "127.0.0.1:4000") }// 创建一个tcp池,提供初始容量和最大容量以及工厂方法
p, err := pool.NewChannelPool(5, 30, factory)// 获取一个连接
conn, err := p.Get()// Close并不会真正关闭这个连接,而是把它放回池子,所以你不必显式地Put这个对象到池子中
conn.Close()// 通过调用MarkUnusable, Close的时候就会真正关闭底层的tcp的连接了
if pc, ok := conn.(*pool.PoolConn); ok {pc.MarkUnusable()pc.Close()
}// 关闭池子就会关闭=池子中的所有的tcp连接
p.Close()// 当前池子中的连接的数量
current := p.Len()
总结
参考资料
Go并发编程实战课
golang并发之sync包