Golang Go语言中分享一个对象生命周期管理的辅助工具

对于高并发场景, 频繁创建大对象, 使用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, -1magicNumber) == 0 { c.value.Close() } }


Golang Go语言中分享一个对象生命周期管理的辅助工具

更多关于Golang Go语言中分享一个对象生命周期管理的辅助工具的实战教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

看标题以为是给时间管理大师用的…

更多关于Golang Go语言中分享一个对象生命周期管理的辅助工具的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


思想不纯洁

这不是我以为的对象。
叫 go 高并发对象管理多好,不容易误解

IT 精英还缺对象吗?

不如直接创建一个有 N 个对象的对象池,N=最大并发数。这样的话,没有对象的线程就等着别的线程释放对象。。。

哎呀,这话看上去怎么那么怪呢?

Closer 的范型参数没用到啊

做泛型约束用的

要考虑跨协程共享和归还

可以参考一个这个 https://github.com/shaovie/ttlcache 有生命周期管理的对象缓存

我这个是手动挡

你好,能举个使用场景吗? 我目前没想到非常合适的场景。

跨协程内存复用

在Go语言中,对象生命周期管理是一个关键方面,尤其是在并发编程中。虽然Go语言本身没有直接提供“对象生命周期管理的辅助工具”这一具体概念或库,但我们可以借助一些内置的功能和包来实现类似的效果。

首先,对于并发执行的对象(如goroutines),Go语言提供了sync.WaitGroup来等待一组goroutines完成。通过Add方法增加计数,Done方法减少计数,Wait方法阻塞直到计数为零,可以方便地管理goroutines的生命周期。

其次,context包在Go语言中也是一个强大的工具,它不仅可以用于传递请求范围的数据,还可以用于取消信号和超时设置。通过context.WithCancelcontext.WithTimeout等方法创建的上下文,可以优雅地终止或超时goroutines,从而实现对它们生命周期的管理。

此外,虽然Go语言没有直接的对象概念(它使用结构体和接口来模拟对象行为),但我们仍然可以通过结构体方法和接口来封装对象的生命周期管理逻辑。

综上所述,虽然Go语言没有专门的“对象生命周期管理的辅助工具”,但我们可以利用sync.WaitGroupcontext包以及结构体和接口等特性,来实现对对象(或goroutines)生命周期的有效管理。

回到顶部