дерстрой экземпляр через "del module_x" - PullRequest
0 голосов
/ 31 мая 2011

Я создал свой собственный модуль "MyServer", который имеет функцию ".connect ()".

Когда я подключился к своему серверу

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

и я удаляю свой модуль («del MyServer»). Я ожидаю, что «con» также немедленно удалено / уничтожено.

Но это не работает. Возможно, причиной этого является сборщик мусора. Но как я могу сказать "удалить сейчас!" :)

Ответы [ 2 ]

2 голосов
/ 31 мая 2011

Я предполагаю, что вы пытаетесь убедиться, что соединение с сервером закрыто?Это не правильный способ сделать это.Есть несколько вариантов:

  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 останется, соединение автоматически закроется (даже в случае исключения) с использованием логики закрытия.


Если вас интересует, почему удаление объекта модуля не удаляет соединение, я рекомендую вам изучить управление памятью в Python, основанное на подсчете ссылок.Всякий раз, когда вы создаете ссылку на объект, счетчик на этом объекте увеличивается на единицу, и всякий раз, когда ссылка удаляется (например, с del, выходя из области видимости ...), счетчик уменьшается на единицу.Всякий раз, когда этот счетчик достигает нуля, объект удаляется.

В вашем случае вы делаете con соединение.Это ссылка на объект подключения, поэтому он имеет ненулевой счетчик ссылок.Когда вы удаляете модуль, это может уменьшать или не уменьшать счетчик ссылок объекта соединения, но не уменьшает его до нуля - потому что con по-прежнему является ссылкой, и вы ее не удалили!

Я думаю, что вы должны попытаться написать закрывающую логику вашего соединения явно, а не неявно.

0 голосов
/ 31 мая 2011

Если случится так, что после выполнения del больше не будет ссылок на объект, тогда объект может быть немедленно освобожден или мусор будет собран позже, тогда объект может быть уничтожен, но это случайно: del удаляет толькоссылка на объект, он не удаляет объекты напрямую.Модуль будет иметь много других ссылок по всей системе.

Если вы хотите закрыть свои соединения, вы должны сделать это явно, иначе сами соединения будут одной из многих вещей, предотвращающих удаление модуля.На практике вам пришлось бы очень усердно работать над удалением модуля, поэтому его обычно не стоит пытаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...