Я предполагаю, что вы пытаетесь убедиться, что соединение с сервером закрыто?Это не правильный способ сделать это.Есть несколько вариантов:
Напишите метод 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, основанное на подсчете ссылок.Всякий раз, когда вы создаете ссылку на объект, счетчик на этом объекте увеличивается на единицу, и всякий раз, когда ссылка удаляется (например, с del
, выходя из области видимости ...), счетчик уменьшается на единицу.Всякий раз, когда этот счетчик достигает нуля, объект удаляется.
В вашем случае вы делаете con
соединение.Это ссылка на объект подключения, поэтому он имеет ненулевой счетчик ссылок.Когда вы удаляете модуль, это может уменьшать или не уменьшать счетчик ссылок объекта соединения, но не уменьшает его до нуля - потому что con
по-прежнему является ссылкой, и вы ее не удалили!
Я думаю, что вы должны попытаться написать закрывающую логику вашего соединения явно, а не неявно.