我创建了自己的模块“MyServer”,它具有“.connect()”函数。
当我连接到我的服务器时
import MyServer
con = MyServer.connect(...)
我删除了我的模块(“del MyServer”)我希望“con”也立即删除/销毁。
但它不起作用。也许原因就是垃圾收集器。但我怎么能说“立即删除!” :)
答案 0 :(得分:2)
我假设您正在尝试确保与服务器的连接已关闭?这不是正确的方法。有几种选择:
编写MyServer.disconnect_all()
方法并使用:
try:
con = MyServer.connect()
finally:
MyServer.disconnect_all()
编写con.close()
方法并使用:
con = MyServer.connect()
try:
...
finally:
con.close()
将结束逻辑放在__del__
对象的con
方法中:
class Connection:
...
def __del__(self):
# do closing things
然后当你完成连接时del con
。请注意,这可能不是最佳选择,因为del con
实际上并不删除con
对象,它只是将引用计数减少一个。如果其他任何东西仍然存在,它将不会被删除。
(最佳选择。)将Connection
写为上下文管理器,可能使用contextlib.contextmanager
来提供帮助。然后你可以这样做:
with con as Connection(...):
...
当剩下with
块时,使用关闭逻辑将自动关闭连接(即使在例外的情况下)。
如果您对为什么删除模块对象不删除连接感兴趣,我建议您查看Python的内存管理,它基于引用计数。无论何时创建对象的引用,该对象上的计数器都会增加1,并且每当删除引用时(例如,使用del
,超出范围,...),计数器将减1。只要此计数器达到零,对象就会被删除。
在您的情况下,您将con
建立连接。这是对连接对象的引用,因此它具有非零引用计数。当您删除模块时,这可能会或可能不会减少连接对象的引用计数,但它不会将其减少到零 - 因为con
仍然是引用而您尚未删除它!
我认为您应该尝试明确地而不是隐式地编写连接的结束逻辑。
答案 1 :(得分:0)
如果在执行del
之后没有更多对该对象的引用,那么该对象可以立即释放或者稍后进行垃圾收集,然后该对象可能被破坏,但这是偶然的:{{1}只删除对象的引用,它不直接删除任何对象。一个模块将在整个系统中有许多其他参考。
如果要关闭连接,则应明确执行此操作,否则连接本身将成为阻止模块被删除的众多因素之一。在实践中,您必须非常努力地删除模块,因此通常不值得尝试。