go sync pool

90 阅读1分钟

描述

临时保存一组对象的池子

目的

缓存已分配但未使用的项目以供以后重用,以减轻垃圾收集器的压力

特性

1、存储在池中的任何项目都可能随时自动删除,不会另行通知。 2、如果Pool拥有对象的唯一引用,则该项目可能会被释放(此处是GO的垃圾回收机制) 3、并发安全的 4、它可以轻松构建高效、线程安全的空闲列表,但它并不适用于所有空闲列表。 5、首次使用后不得复制池

适用场景

管理一组在包的并发独立客户端之间静默共享并可能被重用的临时项目

fmt

它维护一个动态大小的临时输出缓冲区存储,存储在负载下扩展(当许多 goroutine 正在积极打印时)并在静止时缩小。

不适用场景

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

Pool结构分析

type Pool struct {
   noCopy noCopy

   local     unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal
   localSize uintptr        // size of the local array

   victim     unsafe.Pointer // local from previous cycle
   victimSize uintptr        // size of victims array

   // New optionally specifies a function to generate
   // a value when Get would otherwise return nil.
   // It may not be changed concurrently with calls to Get.
   New func() any
}

New func() any

New可选地指定一个函数以在Get意外返回nil时生成一个值。它不能与对Get的调用同时更改。