go sync pool

124 阅读2分钟

go sync pool

  • 简介
  • 方法

简介

是一组可以单独保存和检索的临时对象;

存储在池中的任何项目可能会随时自动删除,恕不另行通知。如果发生这种情况时 Pool 持有唯一的引用,则该项目可能会被释放;

是并发安全的;

Pool 的目的是缓存已分配但未使用的项目以供以后重用,减轻垃圾收集器的压力。也就是说,它可以轻松构建高效、线程安全的空闲列表。但是,它并不适合所有的空闲列表;

池的适当用途是管理一组临时项目,它们在一个包的并发独立客户端之间静默共享并可能被它们重用。池提供了一种在多个客户端之间分摊分配开销的方法;

一个很好使用 Pool 的例子是在 fmt 包中,它维护一个动态大小的临时输出缓冲区存储。存储在负载下扩展(当许多 goroutine 正在积极打印时)并在静止时缩小。

另一方面,作为短期对象的一部分维护的空闲列表不适合用于池,因为在这种情况下开销不能很好地分摊。让这些对象实现它们自己的空闲列表会更有效率;

第一次使用后不得复制池。

方法

func (*Pool) Get

Get 从 Pool 中选择任意项,将其从 Pool 中移除,并将其返回给调用者。

Get 可能会选择忽略池并将其视为空。调用者不应假设传递给 Put 的值与 Get 返回的值之间存在任何关系。

如果 Get 返回 nil 并且 p.New 非 nil,则 Get 返回调用 p.New 的结果。

func (*Pool) Put

将对象放入池中。