V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Nazz
V2EX  ›  Go 编程语言

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

  •  
  •   Nazz · 2023-07-19 09:22:41 +08:00 · 1706 次点击
    这是一个创建于 480 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    哎呀,这话看上去怎么那么怪呢?
    hsfzxjy
        6
    hsfzxjy  
       2023-07-19 13:05:49 +08:00 via Android
    Closer 的范型参数没用到啊
    Nazz
        7
    Nazz  
    OP
       2023-07-19 13:11:44 +08:00 via Android
    @hsfzxjy 做泛型约束用的
    Nazz
        8
    Nazz  
    OP
       2023-07-19 13:15:42 +08:00 via Android
    @xuanbg 要考虑跨协程共享和归还
    shaoyie
        9
    shaoyie  
       2023-07-26 18:58:48 +08:00
    可以参考一个这个 https://github.com/shaovie/ttlcache 有生命周期管理的对象缓存
    Nazz
        10
    Nazz  
    OP
       2023-07-26 19:09:00 +08:00 via Android
    @shaoyie 我这个是手动挡
    jiayiming001
        11
    jiayiming001  
       2023-09-14 16:33:25 +08:00
    @Nazz 你好,能举个使用场景吗? 我目前没想到非常合适的场景。
    Nazz
        12
    Nazz  
    OP
       2023-09-14 18:53:21 +08:00 via Android
    @jiayiming001 跨协程内存复用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2711 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:49 · PVG 14:49 · LAX 22:49 · JFK 01:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.