On Sat, 8 Mar 2014 23:16:07 +1000
Nick Coghlan <ncogh...@gmail.com> wrote:
> On 8 March 2014 23:01, Victor Stinner <victor.stin...@gmail.com> wrote:
> > 2014-03-08 12:45 GMT+01:00 Antoine Pitrou <solip...@pitrou.net>:
> >>> Attached script: never_deleted2.py, it's almost the same but it
> >>> explains better the problem. The script creates MyObject and Future
> >>> objects which are never deleted. Calling gc.collect() does *not* break
> >>> the reference cycle (between the future, the exception, traceback and
> >>> frames). Stopping the event loop does not remove Future nor MyObject
> >>> objects. Only exiting Python does remove the Future object.
> >>
> >> So clearly the coroutine must be kept alive by something.
> >
> > It's a reference cycle. Something like that:
> >
> > Future -> Exception -> Traceback -> Frames -> Local variables ->
> > {Future, MyObject}
> 
> It seems unlikely we could have an uncollectable reference cycle that
> doesn't end up in gc.garbage. Are you sure there are no external
> references to one of the objects in the cycle, thus keeping the whole
> thing alive?

Ok, it's actually quite trivial. The whole chain is kept alive by the
"fut" global variable. If you arrange for it to be disposed of:

  fut = asyncio.Future()
  asyncio.Task(func(fut))
  del fut
  [etc.]

then the problem disappears: as soon as gc.collect() happens, the
MyObject instance is destroyed, the future is collected, and the
future's traceback is printed out.

Regards

Antoine.
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to