分享一个对象生命周期管理的辅助工具

2023-07-19 09:22:41 +08:00
 Nazz

对于高并发场景, 频繁创建大对象, 使用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()
	}
}
1741 次点击
所在节点    Go 编程语言
12 条回复
Juppiter
2023-07-19 09:23:54 +08:00
看标题以为是给时间管理大师用的...
Nazz
2023-07-19 09:34:51 +08:00
@Juppiter 思想不纯洁
zhlxsh
2023-07-19 09:54:38 +08:00
这不是我以为的对象。
叫 go 高并发对象管理多好,不容易误解
Nazz
2023-07-19 10:27:05 +08:00
@zhlxsh IT 精英还缺对象吗?
xuanbg
2023-07-19 12:14:21 +08:00
不如直接创建一个有 N 个对象的对象池,N=最大并发数。这样的话,没有对象的线程就等着别的线程释放对象。。。

哎呀,这话看上去怎么那么怪呢?
hsfzxjy
2023-07-19 13:05:49 +08:00
Closer 的范型参数没用到啊
Nazz
2023-07-19 13:11:44 +08:00
@hsfzxjy 做泛型约束用的
Nazz
2023-07-19 13:15:42 +08:00
@xuanbg 要考虑跨协程共享和归还
shaoyie
2023-07-26 18:58:48 +08:00
可以参考一个这个 https://github.com/shaovie/ttlcache 有生命周期管理的对象缓存
Nazz
2023-07-26 19:09:00 +08:00
@shaoyie 我这个是手动挡
jiayiming001
2023-09-14 16:33:25 +08:00
@Nazz 你好,能举个使用场景吗? 我目前没想到非常合适的场景。
Nazz
2023-09-14 18:53:21 +08:00
@jiayiming001 跨协程内存复用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/957863

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX