Skip to content

Commit

Permalink
bpo-31234: Join threads in test_queue (#3586)
Browse files Browse the repository at this point in the history
Call thread.join() to prevent the "dangling thread" warning.
  • Loading branch information
vstinner committed Sep 14, 2017
1 parent ff40ecd commit 167cbde
Showing 1 changed file with 25 additions and 21 deletions.
46 changes: 25 additions & 21 deletions Lib/test/test_queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,28 +47,27 @@ def run(self):

class BlockingTestMixin:

def tearDown(self):
self.t = None

def do_blocking_test(self, block_func, block_args, trigger_func, trigger_args):
self.t = _TriggerThread(trigger_func, trigger_args)
self.t.start()
self.result = block_func(*block_args)
# If block_func returned before our thread made the call, we failed!
if not self.t.startedEvent.is_set():
self.fail("blocking function '%r' appeared not to block" %
block_func)
self.t.join(10) # make sure the thread terminates
if self.t.is_alive():
self.fail("trigger function '%r' appeared to not return" %
trigger_func)
return self.result
thread = _TriggerThread(trigger_func, trigger_args)
thread.start()
try:
self.result = block_func(*block_args)
# If block_func returned before our thread made the call, we failed!
if not thread.startedEvent.is_set():
self.fail("blocking function '%r' appeared not to block" %
block_func)
return self.result
finally:
thread.join(10) # make sure the thread terminates
if thread.is_alive():
self.fail("trigger function '%r' appeared to not return" %
trigger_func)

# Call this instead if block_func is supposed to raise an exception.
def do_exceptional_blocking_test(self,block_func, block_args, trigger_func,
trigger_args, expected_exception_class):
self.t = _TriggerThread(trigger_func, trigger_args)
self.t.start()
thread = _TriggerThread(trigger_func, trigger_args)
thread.start()
try:
try:
block_func(*block_args)
Expand All @@ -78,11 +77,11 @@ def do_exceptional_blocking_test(self,block_func, block_args, trigger_func,
self.fail("expected exception of kind %r" %
expected_exception_class)
finally:
self.t.join(10) # make sure the thread terminates
if self.t.is_alive():
thread.join(10) # make sure the thread terminates
if thread.is_alive():
self.fail("trigger function '%r' appeared to not return" %
trigger_func)
if not self.t.startedEvent.is_set():
if not thread.startedEvent.is_set():
self.fail("trigger thread ended but event never set")


Expand Down Expand Up @@ -160,8 +159,11 @@ def worker(self, q):

def queue_join_test(self, q):
self.cum = 0
threads = []
for i in (0,1):
threading.Thread(target=self.worker, args=(q,)).start()
thread = threading.Thread(target=self.worker, args=(q,))
thread.start()
threads.append(thread)
for i in range(100):
q.put(i)
q.join()
Expand All @@ -170,6 +172,8 @@ def queue_join_test(self, q):
for i in (0,1):
q.put(-1) # instruct the threads to close
q.join() # verify that you can join twice
for thread in threads:
thread.join()

def test_queue_task_done(self):
# Test to make sure a queue task completed successfully.
Expand Down

0 comments on commit 167cbde

Please sign in to comment.