【python基础】weakref的初次遇见

我们先来看一段代码

python 复制代码
class DatabaseConnection:
    """模拟数据库连接"""

    def __init__(self, db_name):
        self.db_name = db_name
        print(f"连接到数据库 {db_name}")

    def __del__(self):
        print(f"关闭数据库连接 {self.db_name}")


cache = {}

cache["db1"] = DatabaseConnection("my_database")
print("删除 cache 中的 db1 前,cache 内容:", cache)
del cache["db1"]
print("删除 cache 中的 db1 后,cache 内容:", cache)
import gc
gc.collect()  # 手动触发垃圾回收
print("手动触发垃圾回收后,cache 内容:", cache)

print("-" * 50)

输出结果:

python 复制代码
连接到数据库 my_database

删除 cache 中的 db1 前,cache 内容: {'db1': <__main__.DatabaseConnection object at 0x7fb3cc333430>}

关闭数据库连接 my_database

删除 cache 中的 db1 后,cache 内容: {}

手动触发垃圾回收后,cache 内容: {}

​ 这是一个简易的数据库连接管理器。DatabaseConnection类,模拟了一个数据库的连接,字典cache存储数据库的连接对象,我们通过 del删除字典中的 db1条目,但python的回收机制是引用回收,cache字典仍然持有数据库连接对象的引用,因此对象的内存不会立即被释放,如果我们这次连接结束,如果后续不断创建新的数据库连接对象并添加到字典中,那这个字典会越来越大。这时候,我们需要手动的去触发回收垃圾,每次这样子清理非常的麻烦。 ​ 这时候我们就可以使用weakref(弱引用)来缓存数据库的连接,这样子数据库连接对象在没有其他强引用时被自动回收。

python 复制代码
import weakref

class DatabaseConnection:
    """模拟数据库连接"""

    def __init__(self, db_name):
        self.db_name = db_name
        print(f"连接到数据库 {db_name}")

    def __del__(self):
        print(f"关闭数据库连接 {self.db_name}")


cache = weakref.WeakValueDictionary()

db_connection = DatabaseConnection("my_database")
cache["db1"] = db_connection
print("删除 db_connection 前,cache 内容:", dict(cache))
del db_connection
print("删除 db_connection 后,cache 内容:", dict(cache))

输出结果:

python 复制代码
连接到数据库 my_database

删除 db_connection 前,cache 内容: {'db1': <__main__.DatabaseConnection object at 0x7fb3cdb8d2e0>}

关闭数据库连接 my_database

删除 db_connection 后,cache 内容: {}
python"""
相关推荐
wyiyiyi4 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
mit6.8244 小时前
[1Prompt1Story] 滑动窗口机制 | 图像生成管线 | VAE变分自编码器 | UNet去噪神经网络
人工智能·python
没有bug.的程序员4 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋4 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
杜子不疼.7 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
myzzb8 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
TLuoQiu8 小时前
小电视视频内容获取GUI工具
爬虫·python
我叫黑大帅8 小时前
【CustomTkinter】 python可以写前端?😆
后端·python
胡耀超8 小时前
DataOceanAI Dolphin(ffmpeg音频转化教程) 多语言(中国方言)语音识别系统部署与应用指南
python·深度学习·ffmpeg·音视频·语音识别·多模态·asr