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

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

  •  
  •   Nazz · 293 天前 · 1564 次点击
    这是一个创建于 293 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对于高并发场景, 频繁创建大对象, 使用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  
       293 天前
    看标题以为是给时间管理大师用的...
    Nazz
        2
    Nazz  
    OP
       293 天前
    @Juppiter 思想不纯洁
    zhlxsh
        3
    zhlxsh  
       293 天前 via iPhone
    这不是我以为的对象。
    叫 go 高并发对象管理多好,不容易误解
    Nazz
        4
    Nazz  
    OP
       293 天前
    @zhlxsh IT 精英还缺对象吗?
    xuanbg
        5
    xuanbg  
       292 天前
    不如直接创建一个有 N 个对象的对象池,N=最大并发数。这样的话,没有对象的线程就等着别的线程释放对象。。。

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