From 74a6b545c23034c96d87785d5f209d3569ce29ae Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Sat, 21 Oct 2023 11:16:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20concurrent=20=E5=8C=85=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20NewMapPool=20=E5=87=BD=E6=95=B0=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=88=9B=E5=BB=BA=20map=20=E5=AF=B9=E8=B1=A1=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/concurrent/pool.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/utils/concurrent/pool.go b/utils/concurrent/pool.go index e7d3e9a..53d3ff7 100644 --- a/utils/concurrent/pool.go +++ b/utils/concurrent/pool.go @@ -7,6 +7,9 @@ import ( "time" ) +// NewPool 创建一个线程安全的对象缓冲池 +// - 通过 Get 获取一个对象,如果缓冲区内存在可用对象则直接返回,否则新建一个进行返回 +// - 通过 Release 将使用完成的对象放回缓冲区,超出缓冲区大小的对象将被放弃 func NewPool[T any](bufferSize int, generator func() T, releaser func(data T)) *Pool[T] { pool := &Pool[T]{ bufferSize: bufferSize, @@ -19,6 +22,19 @@ func NewPool[T any](bufferSize int, generator func() T, releaser func(data T)) * return pool } +// NewMapPool 创建一个线程安全的 map 缓冲池 +// - 通过 Get 获取一个 map,如果缓冲区内存在可用 map 则直接返回,否则新建一个进行返回 +// - 通过 Release 将使用完成的 map 放回缓冲区,超出缓冲区大小的 map 将被放弃 +func NewMapPool[K comparable, V any](bufferSize int) *Pool[map[K]V] { + return NewPool[map[K]V](bufferSize, func() map[K]V { + return make(map[K]V) + }, func(data map[K]V) { + for k := range data { + delete(data, k) + } + }) +} + // Pool 线程安全的对象缓冲池 // - 一些高频临时生成使用的对象可以通过 Pool 进行管理,例如属性计算等 // - 缓冲区内存在可用对象时直接返回,否则新建一个进行返回