MST

星途 面试题库

面试题:Python自定义资源管理与垃圾回收

假设你有一个自定义的资源类`MyResource`,这个资源需要在使用后进行特定的清理操作(例如关闭连接、释放内存等)。请实现一个上下文管理器,通过`with`语句来管理`MyResource`资源,并阐述Python垃圾回收机制在这种场景下如何与资源清理协同工作。
25.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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垃圾回收机制与资源清理协同工作阐述

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