Hi all

I have read that one should not have to worry about garbage collection in modern versions of Python - it 'just works'.

I don't want to rely on that. My app is a long-running server, with multiple clients logging on, doing stuff, and logging off. They can create many objects, some of them long-lasting. I want to be sure that all objects created are gc'd when the session ends.

I do have several circular references. My experience is that if I do not take some action to break the references when closing the session, the objects remain alive. Below is a very simple program to illustrate this.

Am I missing something? All comments appreciated.

Frank Millman


import gc

class delwatcher:
    # This stores enough information to identify the object being watched.
    # It does not store a reference to the object itself.
    def __init__(self, obj):
        self.id = (obj.type, obj.name, id(obj))
        print('***', *self.id, 'created ***')
    def __del__(self):
        print('***', *self.id, 'deleted ***')

class Parent:
    def __init__(self, name):
        self.type = 'parent'
        self.name = name
        self.children = []
        self._del = delwatcher(self)

class Child:
    def __init__(self, parent, name):
        self.type = 'child'
        self.parent = parent
        self.name = name
        self._del = delwatcher(self)

p1 = Parent('P1')
p2 = Parent('P2')

c1_1 = Child(p1, 'C1_1')
c1_2 = Child(p1, 'C1_2')
c2_1 = Child(p2, 'C2_1')
c2_2 = Child(p2, 'C2_2')

input('waiting ...')

# if next 2 lines are included, parent and child can be gc'd
# for ch in p1.children:
#     ch.parent = None

# if next line is included, child can be gc'd, but not parent
# p1.children = None

del c1_1
del p1

input('wait some more ...')


Reply via email to