[Python-Dev] gcmodule issue w/adding __del__ to generator objects

Neil Schemenauer nas at arctrix.com
Sun Jun 19 02:50:24 CEST 2005


On Sat, Jun 18, 2005 at 06:24:48PM -0400, Phillip J. Eby wrote:
> So, I think I've got this sorted out, assuming that I'm not doing
> something hideously insane by having 'has_finalizer()' always
> check tp_del even for non-heap types, and defining a tp_del slot
> for generators to call close() in.

That sounds like the right thing to do.

I suspect the "uncollectable cycles" problem will not be completely
solvable.  With this change, all generators become objects with
finalizers.  In reality, a 'file' object, for example, has a
finalizer as well but it gets away without telling the GC that
because its finalizer doesn't do anything "evil".  Since generators
can do arbitrary things, the GC must assume the worst.

Most cycles involving enhanced generators can probably be broken by
the GC because the generator is not in the strongly connected part
of cycle.  The GC will have to work a little harder to figure that
out but that's probably not too significant.

The real problem is that some cycles involving enhanced generators
will not be breakable by the GC.  I think some programs that used to
work okay are now going to start leaking memory because objects will
accumulate in gc.garbage.

Now, I could be wrong about all this.  I've have not been following
the PEP 343 discussion too closely.  Maybe Guido has some clever
idea.  Also, I find it difficult to hold in my head a complete model
of how the GC now works.  It's an incredibly subtle piece of code.
Perhaps Tim can comment.

  Neil


More information about the Python-Dev mailing list