2004-07-14 16:11:50 -03:00
|
|
|
import unittest
|
|
|
|
from doctest import DocTestSuite
|
|
|
|
from test import test_support
|
2008-01-19 09:46:06 -04:00
|
|
|
import threading
|
|
|
|
import weakref
|
2008-01-19 11:06:09 -04:00
|
|
|
import gc
|
2008-01-19 09:46:06 -04:00
|
|
|
|
|
|
|
class Weak(object):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def target(local, weaklist):
|
|
|
|
weak = Weak()
|
|
|
|
local.weak = weak
|
|
|
|
weaklist.append(weakref.ref(weak))
|
|
|
|
|
|
|
|
class ThreadingLocalTest(unittest.TestCase):
|
2008-01-19 11:06:09 -04:00
|
|
|
|
2008-01-19 09:46:06 -04:00
|
|
|
def test_local_refs(self):
|
2008-01-19 11:06:09 -04:00
|
|
|
self._local_refs(20)
|
|
|
|
self._local_refs(50)
|
|
|
|
self._local_refs(100)
|
|
|
|
|
|
|
|
def _local_refs(self, n):
|
2008-01-19 09:46:06 -04:00
|
|
|
local = threading.local()
|
|
|
|
weaklist = []
|
|
|
|
for i in range(n):
|
|
|
|
t = threading.Thread(target=target, args=(local, weaklist))
|
|
|
|
t.start()
|
|
|
|
t.join()
|
2008-01-19 11:06:09 -04:00
|
|
|
del t
|
|
|
|
|
|
|
|
gc.collect()
|
2008-01-19 09:46:06 -04:00
|
|
|
self.assertEqual(len(weaklist), n)
|
2008-01-19 11:06:09 -04:00
|
|
|
|
|
|
|
# XXX threading.local keeps the local of the last stopped thread alive.
|
2008-01-19 09:46:06 -04:00
|
|
|
deadlist = [weak for weak in weaklist if weak() is None]
|
|
|
|
self.assertEqual(len(deadlist), n-1)
|
2004-07-14 16:11:50 -03:00
|
|
|
|
2008-01-19 11:06:09 -04:00
|
|
|
# Assignment to the same thread local frees it sometimes (!)
|
|
|
|
local.someothervar = None
|
|
|
|
gc.collect()
|
|
|
|
deadlist = [weak for weak in weaklist if weak() is None]
|
|
|
|
self.assert_(len(deadlist) in (n-1, n), (n, len(deadlist)))
|
|
|
|
|
2004-07-14 16:11:50 -03:00
|
|
|
def test_main():
|
2008-01-19 09:46:06 -04:00
|
|
|
suite = unittest.TestSuite()
|
|
|
|
suite.addTest(DocTestSuite('_threading_local'))
|
|
|
|
suite.addTest(unittest.makeSuite(ThreadingLocalTest))
|
2004-07-14 16:11:50 -03:00
|
|
|
|
|
|
|
try:
|
|
|
|
from thread import _local
|
|
|
|
except ImportError:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
import _threading_local
|
|
|
|
local_orig = _threading_local.local
|
2004-08-28 11:58:31 -03:00
|
|
|
def setUp(test):
|
2004-07-14 16:11:50 -03:00
|
|
|
_threading_local.local = _local
|
2004-08-28 11:58:31 -03:00
|
|
|
def tearDown(test):
|
2004-07-14 16:11:50 -03:00
|
|
|
_threading_local.local = local_orig
|
|
|
|
suite.addTest(DocTestSuite('_threading_local',
|
|
|
|
setUp=setUp, tearDown=tearDown)
|
|
|
|
)
|
|
|
|
|
2007-04-25 14:29:52 -03:00
|
|
|
test_support.run_unittest(suite)
|
2004-07-14 16:11:50 -03:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
test_main()
|