Chris Jerdonek added the comment:

Okay, I think I understand the issue better now.  The threading._dangling 
warning happens because when leaving the saved_test_environment context manager 
in regrtest:

http://hg.python.org/cpython/file/fcdb35b114ab/Lib/test/regrtest.py#l1271

the context manager finds threads still in threading._dangling that weren't 
there at the beginning.  I think the threads are still in there because the 
"tests" variable in the code linked to above is holding references to those 
threads (which isn't surprising given what test_concurrent_futures.py tests).  
So this is preventing the threads (which are in a WeakSet) from being garbage 
collected.

On my machine, severing those references before leaving the context manager 
solves the problem.  You can do this by adding "test = 0" after the 
test_runner() line, or defining "tests" inside an inner function as follows:

if test_runner is None:
    def test_runner():
        tests = unittest.TestLoader().loadTestsFromModule(the_module)
        support.run_unittest(tests)
test_runner()

To be completely sure, we may also need to do something to ensure that the 
threads are garbage collected before leaving the context manager.  Currently, 
an explicit call to support.gc_collect() happens in threading_cleanup() (which 
is in turn called by reap_threads(), etc):

http://hg.python.org/cpython/file/fcdb35b114ab/Lib/test/support.py#l1665

But I'm not sure if that's late enough in the process to guarantee garbage 
collection of those threads with the test_runner() change above (since the 
tests list might still be defined).

----------

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

Reply via email to