我经常创建在内部使用某些资源的类,例如请求会话,IMAP连接。我在__init__
初始化了这些资源。
例如:
class SomeClass:
def __init__(self, login, password):
self.session = requests.Session()
self.imap_connection = IMAPLib.connect(...)
... and so on ...
所以主要的问题是:我应该手动释放这些资源,例如会话,imap_connections,或者让它们在GC运行时死亡或者它不安全是非常安全的,如果是的话,什么是最佳解决方案?
据我所知,除了实现一些free_resources
方法并明确调用它之外,还要实现__enter__
,它返回self
和__exit__
方法,这会耗尽所有这些资源。然后我使用with
块实例化这些类。
答案 0 :(得分:0)
上下文管理器支持(对with
块的支持)是最便携,一致的方法。否则,假设资源定义了自己的__del__
清理,然后禁止引用循环,在CPython中,当所有者实例丢失其最后引用时,它们将被清除。不幸的是,如果是循环,在CPython 3.4之前,循环中存在__del__
终结器将阻止循环GC完全清除循环,因此内存泄漏并且没有调用终结器。在3.4+中,它可能最终会被清理,但由于需要进行循环收集,时间不会是确定性的。