Python 使用 weakref 避免内存泄漏

python中weakref模块通过弱引用机制打破循环引用以防止内存泄漏,具体包括:一、weakref.ref创建不增加引用计数的可调用弱引用;二、weakkeydictionary使键对象销毁后自动移除对应项;三、weakvaluedictionary使值对象销毁后自动失效对应条目;四、在回调中用weakref.ref避免闭包强持有对象;五、weakref.finalize注册对象销毁前的清理回调。

在 Python 中,当对象之间存在循环引用时,垃圾回收器可能无法及时释放内存,导致内存泄漏。weakref 模块提供弱引用机制,使对象可以在不增加引用计数的前提下被访问,从而打破循环引用。以下是使用 weakref 避免内存泄漏的具体方法:

一、使用 weakref.ref 创建弱引用

weakref.ref 返回一个可调用对象,该对象在目标对象未被销毁时返回目标对象,否则返回 None。它不参与引用计数,因此不会阻止目标对象被回收。

1、导入 weakref 模块:import weakref

2、定义一个类并创建实例:class DataHolder: pass; obj = DataHolder()

3、创建弱引用:ref_obj = weakref.ref(obj)

4、通过调用弱引用对象获取原对象:target = ref_obj()(若 target 为 None,说明原对象已被回收)

二、使用 weakref.WeakKeyDictionary 存储以对象为键的映射

WeakKeyDictionary 的键是弱引用,当键对象被销毁后,对应键值对自动从字典中移除,避免因字典长期持有所致的内存滞留。

1、创建 WeakKeyDictionary 实例:cache = weakref.WeakKeyDictionary()

2、将对象作为键存入:holder = DataHolder(); cache[holder] = "metadata"

3、删除 holder 引用后再次访问 cache,len(cache) 将变为 0

三、使用 weakref.WeakValueDictionary 存储以对象为值的映射

WeakValueDictionary 的值是弱引用,当值对象被销毁时,对应条目自动失效,适用于缓存场景中避免值对象长期驻留内存。

Motiff

Motiff是由猿辅导旗下的一款界面设计工具,定位为“AI时代设计工具”

下载

1、创建 WeakValueDictionary 实例:pool = weakref.WeakValueDictionary()

2、插入键值对:key_obj = DataHolder(); pool["key"] = key_obj

3、删除 key_obj 的强引用后,pool["key"] 将引发 KeyError

四、在回调函数中使用 weakref.ref 防止闭包持有对象

当为对象注册回调(如事件监听器)时,若回调函数直接引用对象,会形成循环引用。使用 weakref.ref 可解耦生命周期依赖。

1、定义带回调的类:class EventSource: def __init__(self): self.callbacks = []

2、注册弱引用回调:def callback_ref(): ref = weakref.ref(self); return lambda: ref() and ref().on_event()

3、将回调加入列表:self.callbacks.append(callback_ref())

五、使用 weakref.finalize 注册对象销毁时的清理逻辑

finalize 允许为对象注册一个在对象被销毁前执行的回调,无需手动管理生命周期,适合资源释放或日志记录。

1、创建需监控的对象:resource = open("temp.txt", "w")

2、注册终结器:finalizer = weakref.finalize(resource, lambda f: f.close() if not f.closed else None)

3、显式删除 resource 引用:del resource,随后 finalize 回调将被执行

相关推荐:

芝奇 EXPO ULL 内存性能首测曝光,相比非 ULL 内存提升约 4%

7 月 10 日消息,科技媒体 HardwareLuxx 于 7 月 6 日发布博文,分享了 AMD EXPO Ultra Low Latency(ULL)内存首批测试结果,称相比较非 ULL 套装内存,ULL 内存性能提升有限,约为 4%。该媒体测试芝奇 G.Skill 的新款 Trident Z5 NeoX RGB 内存,此前报道,该内存的 CL28 新品首发价远超预期,溢价超过 79%。该媒...

带宽直逼 DDR6:MRDIMM 让 DDR5 服务器内存速率冲向 17600 MT/s

7 月 10 日消息,据 Wccftech 今日报道,JEDEC(固态技术协会)早于 2020 年代初引入的 MRDIMM 架构,正在成为解决当前及下一代数据中心内存带宽瓶颈的关键方案。该技术由英特尔率先在其至强 6 产品线(代号 Granite Rapids)上采用,如今已获得 AMD 等主流厂商的跟进。MRDIMM 的核心思路是在不改变 DDR5 物理插槽的前提下,通过内置于模组的多路复用器(...

SK 集团会长崔泰源:AI 驱动内存需求呈指数级增长,未来五年产能翻倍仍难满足

感谢网友 不一样的体验 的线索投递! 7 月 10 日消息,SK 海力士今日在纳斯达克挂牌交易其美国存托凭证(ADR)。随后,SK 集团会长崔泰源接受了彭博社与 CNBC 的采访。注意到,崔泰源表示,在人工智能时代,内存行业已进入结构性增长阶段。过去,内存的需求主要取决于人口数量或是智能手机和个人电脑的销量。然而,随着 AI 智能体、推理过程中产生的键值缓存(KV Cache)、物理 AI 以及机...

曝三星为消化内存成本压力,Galaxy S27/S27+ 手机将配第三方显示驱动芯片

7 月 11 日消息,科技媒体 Zdnet Korea 昨日(7 月 10 日)发布博文,报道称三星为消化内存等元件上涨的成本压力,在 Galaxy S27 系列的 4 款机型中,可能会区分使用不同的显示驱动芯片(DDI)。注:DDI 作用是把主控输出的显示信号转换为面板可执行的驱动指令,并精确控制像素点亮、亮度与刷新过程。在 Galaxy S 系列旗舰机型中,DDI 历年均由三星集团 Syste...

SK 海力士 CEO 郭鲁正:内存行业明年将迎来史上最严峻局势,2030 年以后可能仍然供不应求

感谢网友 华南吴彦祖、麻辣清补凉 的线索投递! 7 月 11 日消息,据路透社今天报道,SK 海力士首席执行官郭鲁正(注:Kwak Noh-jung)表示,全球 DRAM 行业即将面临有史以来最严重的供应短缺,内存市场仍将供不应求的局面可能得等到 2030 年以后才能缓解。郭鲁正在接受采访时表示:“从供应角度来看,我们预计明年将是内存行业历史上最困难的一年。客户需求持续增长,而我们的产能存在限制。...

AI 内存 V-Die 方案亮相:侧立放置 DRAM 吞吐 540 tokens/s,较 HBM4 高 82.43%

7 月 11 日消息,科技媒体 Tom's Hardware 昨日(7 月 10 日)发布博文,报道称在 6 月召开的 IEEE / JSAP 超大规模集成电路技术研讨会上,针对 AI 加速器的内存散热与带宽瓶颈,研究团队提出 V-Die 与 MOSAIC 两种 HBM 集成方案。注:高带宽内存(HBM)是面向高性能计算与 AI 加速器的近封装内存技术,通过多层 DRAM 堆叠,并借助超宽总线与处...

小米 REDMI Note 17 手机跑分曝光:高通骁龙 6s Gen4 芯片 +12GB 内存

7 月 8 日消息,科技媒体 NotebookCheck 今天(7 月 8 日)发布博文,报道称型号为 2607DRA18C 的小米手机现身 GeekBench 跑分库,6.7.1 版本单核成绩为 1027 分,多核成绩为 3002 分,预估关联 REDMI Note 17 手机(不过有博主认为是 Pro 机型)。查询公开资料,小米 REDMI Note 17 系列预估共有 3 款型号,均采用城市...

Patriot 正式推出无限镜光效内存模组 Viper Steel 5 Infinite DDR5

7 月 8 日消息,Patriot(博帝)今日正式推出 Viper Steel 5 Infinite DDR5 系列内存模组。这批内存条提供 RGB 与 Non-RGB 版本,其中前者搭载独家无限镜面 RGB 导光技术。Patriot 表示,传统的“无限镜”为了营造反射效果,通常需要设置较深的物理空间,这在宽度受限的标准内存插槽中难以实现;而其研发团队通过创新的实心光学结构解决此限制,在受限的插槽...