如何解决通过“ del module_x”销毁实例
| 我创建了自己的模块\“ MyServer \”,其功能为\“。connect()\”。 连接到服务器后import MyServer
con = MyServer.connect(...)
并且我删除了我的模块(\“ del MyServer \”),我希望\“ con \”也能立即删除/销毁。
但这是行不通的。也许原因是垃圾收集器。但是我怎么能说“立即删除!” :)
解决方法
我假设您正在尝试确保与服务器的连接已关闭?这不是正确的方法。有几种选择:
编写一个“ 1”方法并使用:
try:
con = MyServer.connect()
finally:
MyServer.disconnect_all()
编写一个“ 3”方法并使用:
con = MyServer.connect()
try:
...
finally:
con.close()
将闭合逻辑放在con
对象的__del__
方法中:
class Connection:
...
def __del__(self):
# do closing things
完成连接后,请执行del con
。请注意,这可能不是最佳选择,因为del con
实际上并未删除con
对象,它只是将其引用计数减一。如果仍然保留其他任何内容,则不会将其删除。
(最佳选择。)将Connection
用作上下文管理器,可能使用contextlib.contextmanager
进行帮助。然后,您可以执行以下操作:
with con as Connection(...):
...
并在离开“ 14”块时使用您的关闭逻辑自动关闭连接(即使在例外情况下)。
如果您对删除模块对象为什么不删除连接感兴趣,我建议您研究一下基于引用计数的Python内存管理。每当您创建对一个对象的引用时,该对象上的计数器就会增加一个,并且每当删除引用时(例如,使用del
,超出范围,...),计数器就会减少一。每当此计数器达到零时,都会删除该对象。
在您的情况下,您建立con
连接。这是对连接对象的引用,因此它具有非零的引用计数。当您删除模块时,这可能会或可能不会减少连接对象的引用计数,但不会将其减少为零-因为ѭ6still仍然是引用,并且您尚未删除!
我认为您应该尝试显式而不是隐式地编写连接的关闭逻辑。
, 如果在执行del
之后碰巧不再有对该对象的引用,则该对象可能立即被释放,或者稍后再进行垃圾回收,那么该对象可能会被销毁,但这是偶然的:del
仅删除了对对象的引用,它不会不会直接删除任何对象。一个模块将在整个系统中具有许多其他参考。
如果要关闭连接,则应明确执行此操作,否则连接本身将成为阻止模块删除的众多措施之一。在实践中,您必须非常努力地删除模块,因此通常不值得尝试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。