class MyResource:
def __init__(self):
print("初始化资源")
def close(self):
print("清理资源")
class ResourceManager:
def __init__(self):
self.resource = None
def __enter__(self):
self.resource = MyResource()
return self.resource
def __exit__(self, exc_type, exc_val, exc_tb):
if self.resource:
self.resource.close()
# 使用上下文管理器
with ResourceManager() as res:
print("使用资源")
Python垃圾回收机制与资源清理协同工作阐述
- 引用计数:Python使用引用计数作为主要的垃圾回收机制。当对象的引用计数降为0时,对象会被立即回收。在上述
with
语句的场景中,MyResource
对象在__enter__
方法中创建并返回,此时它被res
引用,引用计数为1。当with
块结束时,res
的作用域结束,对MyResource
对象的引用被删除,对象的引用计数减为0,Python垃圾回收机制会立即回收该对象所占用的内存。
- 分代回收:在对象的生命周期中,Python还有分代回收机制。对于长时间存活的对象(老年代对象),垃圾回收器会减少对它们的扫描频率,以提高性能。在资源管理的场景下,如果
MyResource
对象的生命周期跨越了多个垃圾回收周期,分代回收机制会适当调整对它的回收策略,但只要其引用计数为0,依然会被回收。不过,分代回收主要是优化垃圾回收的性能,对于资源清理而言,关键还是在__exit__
方法中显式地调用资源的清理方法(如close
),确保资源在引用计数为0被回收之前,已经完成特定的清理操作(如关闭连接等),避免资源泄漏。