2015-10-29 30 views
2

我经常创建内部使用某些资源(如请求会话,IMAP连接)的类。我在__init__初始化这些资源。我应该拆除__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

上下文管理器支持(支持with块)是最便携,一致的方法。否则,假定资源定义了自己的清理,那么在CPython中禁止引用循环时,它们将在所有者实例失去最后一个引用时清除。不幸的是,如果在CPython 3.4之前有个周期,那么循环中终止器的存在将阻止循环GC完全清除循环,因此将调用内存泄漏并且不终止器。在3.4+中,它最终可能会被清理,但由于需要进行循环收集,所以时间不会是确定性的。

+0

同样在没有'with'块的情况下,这些对象不会调用__del__'方法吗? – Glueon

+0

在CPython中,引用计数变为零时(因此在大多数情况下,当函数返回/异常冒出函数并且回溯被清除时)。但是,是的,'with'允许在已知点立即进行确定性清理,而不是“当物体某时消失”。 – ShadowRanger

相关问题