对于高并发场景, 频繁创建大对象, 使用sync.Pool
优化, 应该有一点帮助吧 😆
const magicNumber = 1 << 62
type Closer[T any] interface {
Close()
}
type Object[T Closer[T]] struct {
state int64
value T
}
func NewObject[T Closer[T]](v T) *Object[T] {
return &Object[T]{value: v, state: magicNumber}
}
func (c *Object[T]) Value() T {
return c.value
}
func (c *Object[T]) Add() {
atomic.AddInt64(&c.state, 1)
}
func (c *Object[T]) Done() {
if atomic.AddInt64(&c.state, -1) == 0 {
c.value.Close()
}
}
func (c *Object[T]) Release() {
if atomic.AddInt64(&c.state, -1*magicNumber) == 0 {
c.value.Close()
}
}
1
Juppiter 2023-07-19 09:23:54 +08:00
看标题以为是给时间管理大师用的...
|
3
zhlxsh 2023-07-19 09:54:38 +08:00 via iPhone
这不是我以为的对象。
叫 go 高并发对象管理多好,不容易误解 |
5
xuanbg 2023-07-19 12:14:21 +08:00
不如直接创建一个有 N 个对象的对象池,N=最大并发数。这样的话,没有对象的线程就等着别的线程释放对象。。。
哎呀,这话看上去怎么那么怪呢? |
6
hsfzxjy 2023-07-19 13:05:49 +08:00 via Android
Closer 的范型参数没用到啊
|
9
shaoyie 2023-07-26 18:58:48 +08:00
可以参考一个这个 https://github.com/shaovie/ttlcache 有生命周期管理的对象缓存
|
11
jiayiming001 2023-09-14 16:33:25 +08:00
@Nazz 你好,能举个使用场景吗? 我目前没想到非常合适的场景。
|
12
Nazz OP @jiayiming001 跨协程内存复用
|