Nick Coghlan added the comment:

In addition to the problem Neil noted with references in extension modules 
keeping module objects themselves alive, Antoine recently noted that the other 
major challenge is the reference cycles between module global dictionaries and 
their contents. As soon as a module global has both a __del__ method and a 
reference back to the module globals, the entire cycle becomes uncollectable. I 
suspect one of the reasons PyPy can cope without the explicit reference 
breaking step is that their GC is better able to cope with __del__ methods than 
ours.

I wonder if a useful interim step might be to make the current explicit 
reference breaking hack a bit smarter by looking at the reference counts. 
(Note: some aspects of this idea could be made simpler if modules supported 
weak references)

1. Call importlib.invalidate_caches()
2. Delete the first module from sys.modules that has a reference count of 
exactly one
3. Repeat 2 until sys.modules is empty or every remaining module has a 
reference count greater than 1 (meaning another module has a reference to it 
one way or another)
4. Pick the module in sys.modules with the lowest number of references to it, 
delete it from sys.modules and delete the reference from the module object to 
its dictionary
5. Repeat 4 until sys.modules is empty

Throughout the process, keep an eye on gc.garbage - if we see a module dict 
show up there, hit it with the "set all globals to None" hammer. (The new 
callback functionality in 3.3 makes that easier - for example, you could put a 
sentinel object in the globals of the module being cleared and watching for a 
dict containing that sentinel object showing up in 'uncollectable' during the 
stop phase)

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue812369>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to