我经常创建一些类,这些类在内部使用一些资源,比如请求会话、IMAP连接。我在__init__
中初始化这些资源。你知道吗
例如:
class SomeClass:
def __init__(self, login, password):
self.session = requests.Session()
self.imap_connection = IMAPLib.connect(...)
... and so on ...
所以主要的问题是:我应该手动释放这些资源,比如会话、imap\u连接,还是在GC运行时让它们死掉比较安全,或者不安全,如果是这样,最好的解决方案是什么?你知道吗
据我所知,除了实现一些free_resources
方法并显式调用它之外,还实现了__enter__
,它返回self
和一个__exit__
方法,该方法会分解所有这些资源。然后我使用with
块实例化这些类。你知道吗
上下文管理器支持(对
with
块的支持)是最可移植、一致的方法。否则,假设资源定义了它们自己的__del__
清理,那么,除非引用循环,否则在CPython中,当所有者实例丢失最后一个引用时,它们将被清理。不幸的是,如果在cpython3.4之前有一个循环,那么循环中的__del__
终结器将阻止循环GC清除该循环,因此内存泄漏并且不调用终结器。在3.4+中,它可能最终会被清除,但由于需要循环收集,所以时间不会是确定的。你知道吗相关问题 更多 >
编程相关推荐