LINUX.ORG.RU

[python] циклические зависимости?

 


0

0

Есть такой код:

class Ancestor:
    def __init__(self):
        self.hello()

    def hello(self):
        print("hello!")

    def __del__(self):
        print("destructor")


class Child(Ancestor):
    def __init__(self):
        self.hello = self.myhello
        Ancestor.__init__(self)

    def myhello(self):
        print("this is my hello")


child = Child()
print("deleting instance")
del child

Так вот надписи «destructor» мы не увидим. Почему такая трава происходит? Как лечить?(делать del self.hello ?).

★★★★★
Ответ на: комментарий от Absurd

ну здрасти. в топике как раз приведен пример проги которая показывает что утечка ещё как возможна.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

короче, итог всего:

Явный вызов gc.collect помогает. Теперь я понял все глюки своей программы. Коллектор вызывается только через определённое кол-по питон-инструкций а не по таймеру как я ожидал. А так как у мой модуль бОльшую часть времени проводит в ожидании ответа от select-а то я у меня нифига мусор и не собирался.

Поставил по таймеру раз в пару секунд чистить инстансы.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

>в топике как раз приведен пример проги которая показывает что утечка ещё как возможна.

Какая утечка? Ты там удалил ссылку на этот объект из локального скопа.

Absurd ★★★
()
Ответ на: комментарий от Absurd

> Какая утечка? Ты там удалил ссылку на этот объект из локального скопа.

верно, я удалил отовсюду откуда мог. Могу в список засунуть child а потом оттуда удалить, но это ничего не поменяет.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

>верно, я удалил отовсюду откуда мог.

Да хоть отвсюду. Привилегия считать ссылки и удалять объект по их отсутствию все равно принадлежит gc. Который запускается подчиняясь своей внутренней логике или не запускается совсем, например для объектов которые живы на момент завершения программы.

Absurd ★★★
()
Ответ на: комментарий от Absurd

Ты говорил "Не выжрется, если не сохраняешь
ссылку на объект ассоциированный с клиентом
в долговременной структуре". Я тебе говорю
что ничего я не сохраняю и тут ты мне про
локал скоп почему-то начал говорить.

gc делает не то что ты думаешь. Убивает объекты
Py_DECREF который вызывает деаллокатор объекта
в случае если счётчик ссылок равен нулю:

#define Py_DECREF(op)                   \
    do {                        \
        if (_Py_DEC_REFTOTAL  _Py_REF_DEBUG_COMMA   \
        --((PyObject*)(op))->ob_refcnt != 0)    \
            _Py_CHECK_REFCNT(op)        \
        else                    \
        _Py_Dealloc((PyObject *)(op));      \
        } while (0)


А gc(http://docs.python.org/3.0/library/gc.html)
занимается тем что ищет объекты-контейнеры которые
содержат другие объекты которые ссылаются на свой
контейнер(циклические зависимости). больше он ничего
делать не умеет.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от dave

>Это неявно предполагается при обработке исключительных ситуаций в конструкторах при выделении как одиночных объектов, так и массивов.

Неотпарсил мысль. Можно помедленнее?

>Смело можно считать непреложной истиной :)

Не более непреложной, чем запрет goto: действительно повышается общая граблеопасность, но не более того.

>А ты читал Саттера?

Нет. Чем хорош?

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>>Это неявно предполагается при обработке исключительных ситуаций в конструкторах при выделении как одиночных объектов, так и массивов.

>Неотпарсил мысль. Можно помедленнее?

Тогда прочитай книгу Герба Саттера "Решение сложных задач на C++" (Exceptional C++). Там все разжёвано. Я объяснять тебе ничего не буду. Пусть это сделает автор книги.

Потом, это все же фича самого языка. Почему её некоторые не знают - другой вопрос. C++, вообще, могуч. Поэтому сама возможность зафиксировать все моменты в документе представляется мало-реальной.

dave ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.