我们先来看一段代码
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"""