2015-10-29 29 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

相關問題