refactor: 迁移 concurrent.Pool 至 hub.ObjectPool,并将 concurrent 包更名为 hub
This commit is contained in:
@@ -1 +0,0 @@
|
||||
package concurrent_test
|
||||
@@ -1,18 +1,18 @@
|
||||
package concurrent
|
||||
package hub
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// NewPool 创建一个线程安全的对象缓冲池
|
||||
// NewObjectPool 创建一个线程安全的对象缓冲池
|
||||
// - 通过 Get 获取一个对象,如果缓冲区内存在可用对象则直接返回,否则新建一个进行返回
|
||||
// - 通过 Release 将使用完成的对象放回缓冲区,超出缓冲区大小的对象将被放弃
|
||||
func NewPool[T any](generator func() *T, releaser func(data *T)) *Pool[*T] {
|
||||
func NewObjectPool[T any](generator func() *T, releaser func(data *T)) *ObjectPool[*T] {
|
||||
if generator == nil || releaser == nil {
|
||||
panic(errors.New("generator or releaser is nil"))
|
||||
}
|
||||
return &Pool[*T]{
|
||||
return &ObjectPool[*T]{
|
||||
releaser: releaser,
|
||||
p: sync.Pool{
|
||||
New: func() interface{} {
|
||||
@@ -22,22 +22,22 @@ func NewPool[T any](generator func() *T, releaser func(data *T)) *Pool[*T] {
|
||||
}
|
||||
}
|
||||
|
||||
// Pool 线程安全的对象缓冲池
|
||||
// - 一些高频临时生成使用的对象可以通过 Pool 进行管理,例如属性计算等
|
||||
// ObjectPool 线程安全的对象缓冲池
|
||||
// - 一些高频临时生成使用的对象可以通过 ObjectPool 进行管理,例如属性计算等
|
||||
// - 缓冲区内存在可用对象时直接返回,否则新建一个进行返回
|
||||
// - 通过 Release 将使用完成的对象放回缓冲区,超出缓冲区大小的对象将被放弃
|
||||
type Pool[T any] struct {
|
||||
type ObjectPool[T any] struct {
|
||||
p sync.Pool
|
||||
releaser func(data T)
|
||||
}
|
||||
|
||||
// Get 获取一个对象
|
||||
func (slf *Pool[T]) Get() T {
|
||||
return slf.p.Get().(T)
|
||||
func (op *ObjectPool[T]) Get() T {
|
||||
return op.p.Get().(T)
|
||||
}
|
||||
|
||||
// Release 将使用完成的对象放回缓冲区
|
||||
func (slf *Pool[T]) Release(data T) {
|
||||
slf.releaser(data)
|
||||
slf.p.Put(data)
|
||||
func (op *ObjectPool[T]) Release(data T) {
|
||||
op.releaser(data)
|
||||
op.p.Put(data)
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
package concurrent_test
|
||||
package hub_test
|
||||
|
||||
import (
|
||||
"github.com/kercylan98/minotaur/utils/concurrent"
|
||||
"github.com/kercylan98/minotaur/utils/hub"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func BenchmarkPool_Get2Put(b *testing.B) {
|
||||
var pool = concurrent.NewPool[map[string]int](func() *map[string]int {
|
||||
var pool = hub.NewObjectPool[map[string]int](func() *map[string]int {
|
||||
return &map[string]int{}
|
||||
}, func(data *map[string]int) {
|
||||
for k := range *data {
|
||||
1
utils/hub/object_pool_test.go
Normal file
1
utils/hub/object_pool_test.go
Normal file
@@ -0,0 +1 @@
|
||||
package hub_test
|
||||
Reference in New Issue
Block a user