Update for threading.local test.
This commit is contained in:
parent
71a0451f67
commit
95016e71ea
|
@ -3,6 +3,7 @@ from doctest import DocTestSuite
|
||||||
from test import test_support
|
from test import test_support
|
||||||
import threading
|
import threading
|
||||||
import weakref
|
import weakref
|
||||||
|
import gc
|
||||||
|
|
||||||
class Weak(object):
|
class Weak(object):
|
||||||
pass
|
pass
|
||||||
|
@ -13,19 +14,34 @@ def target(local, weaklist):
|
||||||
weaklist.append(weakref.ref(weak))
|
weaklist.append(weakref.ref(weak))
|
||||||
|
|
||||||
class ThreadingLocalTest(unittest.TestCase):
|
class ThreadingLocalTest(unittest.TestCase):
|
||||||
|
|
||||||
def test_local_refs(self):
|
def test_local_refs(self):
|
||||||
|
self._local_refs(20)
|
||||||
|
self._local_refs(50)
|
||||||
|
self._local_refs(100)
|
||||||
|
|
||||||
|
def _local_refs(self, n):
|
||||||
local = threading.local()
|
local = threading.local()
|
||||||
weaklist = []
|
weaklist = []
|
||||||
n = 20
|
|
||||||
for i in range(n):
|
for i in range(n):
|
||||||
t = threading.Thread(target=target, args=(local, weaklist))
|
t = threading.Thread(target=target, args=(local, weaklist))
|
||||||
t.start()
|
t.start()
|
||||||
t.join()
|
t.join()
|
||||||
|
del t
|
||||||
|
|
||||||
|
gc.collect()
|
||||||
self.assertEqual(len(weaklist), n)
|
self.assertEqual(len(weaklist), n)
|
||||||
|
|
||||||
|
# XXX threading.local keeps the local of the last stopped thread alive.
|
||||||
deadlist = [weak for weak in weaklist if weak() is None]
|
deadlist = [weak for weak in weaklist if weak() is None]
|
||||||
# XXX threading.local keeps the local of the last stopped thread alive
|
|
||||||
self.assertEqual(len(deadlist), n-1)
|
self.assertEqual(len(deadlist), n-1)
|
||||||
|
|
||||||
|
# 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)))
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
suite = unittest.TestSuite()
|
suite = unittest.TestSuite()
|
||||||
suite.addTest(DocTestSuite('_threading_local'))
|
suite.addTest(DocTestSuite('_threading_local'))
|
||||||
|
|
Loading…
Reference in New Issue