@lru_cache装饰器;

@lru_cache装饰器;

核心概念

  1. 缓存的是函数调用后的返回值(一个具体对象),不是函数本身。
  2. 第一次调用真正执行函数体;之后所有调用直接返回同一个缓存对象。
  3. maxsize=1 如果函数无参数、只有一种调用方式,写不写效果一样,但写出来更能表达"这是当单例用的"这个意图。

装饰在类上:可行,效果等价

类本身是可调用对象(RagGraphBuilder() 本质是一次函数调用),所以可以直接装饰类

注意事项

装饰在实例方法上:⚠️ 陷阱,不推荐

class RagGraphBuilder:
    @lru_cache(maxsize=1)
    def build(self):   # self 也是参数,会被算进缓存 key
        ...

问题:

  • self 是缓存 key 的一部分 → 不同实例调用会各自缓存,不是全局单例
  • self 被缓存字典一直引用 → 实例永远不会被垃圾回收(内存泄漏)

⚠️ lru_cache 只能装饰同步函数:如果需要异步初始化,同步 lru_cache装不下,需要换成手写的异步单例。

posted @ 2026-07-12 17:38  asphyxiasea  阅读(2)  评论(0)    收藏  举报