通过“del module_x”销毁实例

时间:2011-05-31 09:05:36

标签: python module garbage

我创建了自己的模块“MyServer”,它具有“.connect()”函数。

当我连接到我的服务器时

import MyServer
con = MyServer.connect(...)

我删除了我的模块(“del MyServer”)我希望“con”也立即删除/销毁。

但它不起作用。也许原因就是垃圾收集器。但我怎么能说“立即删除!” :)

2 个答案:

答案 0 :(得分:2)

我假设您正在尝试确保与服务器的连接已关闭?这不是正确的方法。有几种选择:

  1. 编写MyServer.disconnect_all()方法并使用:

    try: 
        con = MyServer.connect()
    finally:
         MyServer.disconnect_all()
    
  2. 编写con.close()方法并使用:

    con = MyServer.connect()
    try:
        ...
    finally:
        con.close()
    
  3. 将结束逻辑放在__del__对象的con方法中:

    class Connection:
        ...
        def __del__(self):
            # do closing things
    

    然后当你完成连接时del con。请注意,这可能不是最佳选择,因为del con实际上并不删除con对象,它只是将引用计数减少一个。如果其他任何东西仍然存在,它将不会被删除。

  4. (最佳选择。)将Connection写为上下文管理器,可能使用contextlib.contextmanager来提供帮助。然后你可以这样做:

    with con as Connection(...):
        ...
    

    当剩下with块时,使用关闭逻辑将自动关闭连接(即使在例外的情况下)。


  5. 如果您对为什么删除模块对象不删除连接感兴趣,我建议您查看Python的内存管理,它基于引用计数。无论何时创建对象的引用,该对象上的计数器都会增加1,并且每当删除引用时(例如,使用del,超出范围,...),计数器将减1。只要此计数器达到零,对象就会被删除。

    在您的情况下,您将con建立连接。这是对连接对象的引用,因此它具有非零引用计数。当您删除模块时,这可能会或可能不会减少连接对象的引用计数,但它不会将其减少到零 - 因为con仍然是引用而您尚未删除它!

    我认为您应该尝试明确地而不是隐式地编写连接的结束逻辑。

答案 1 :(得分:0)

如果在执行del之后没有更多对该对象的引用,那么该对象可以立即释放或者稍后进行垃圾收集,然后该对象可能被破坏,但这是偶然的:{{1}只删除对象的引用,它不直接删除任何对象。一个模块将在整个系统中有许多其他参考。

如果要关闭连接,则应明确执行此操作,否则连接本身将成为阻止模块被删除的众多因素之一。在实践中,您必须非常努力地删除模块,因此通常不值得尝试。