真实世界的Go设计模式 - 对象池模式
💡
原文中文,约1100字,阅读约需3分钟。
📝
内容提要
对象池是一种设计模式,用于创建和销毁对象,提高效能并减少资源开销。sync.Pool是Go标准库中的一个有用的结构,用于管理和重用临时对象。net/rpc包和database/sql包也使用了对象池来管理对象的重用。此外,还有一类叫做goroutine pool的库,可以方便地实现goroutine的重用。
🎯
关键要点
-
对象池是一种设计模式,用于创建和销毁对象,提高效能并减少资源开销。
-
对象池包含一组已初始化的可用对象,用户可以从池中获取对象并在使用后归还。
-
在高初始化代价且需求频繁的情况下,使用对象池可以显著提升效能。
-
sync.Pool是Go标准库中的结构,用于管理和重用临时对象,减少内存分配和回收的开销。
-
sync.Pool的特点包括维护可共享的临时对象集合、通过New字段生成新对象、使用Get和Put方法管理对象。
-
Pool会根据需求自动调整对象个数,并定期进行垃圾回收。
-
每个P都有本地pool,goroutine优先从本地pool获取和放回对象。
-
net/rpc包使用链表管理常用的Response和Request对象的重用。
-
database/sql包实现了连接池,允许重用数据库连接,默认最大空闲连接数为2。
-
fatih/pool是一个常用的网络连接池。
-
goroutine pool(worker pool)库众多,使用channel和goroutine实现,方便定制和改造。
➡️