真实世界的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实现,方便定制和改造。

➡️

继续阅读