summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-07-24 22:33:56 (GMT)
committerGitHub <noreply@github.com>2017-07-24 22:33:56 (GMT)
commitd7e64d9934d86aa6173229de5af5fe908662a33a (patch)
treed382778b648745f59a3d75d9128755882328af37
parentd439d3e291d30057a676825f4de6ee5bdc24f874 (diff)
downloadcpython-d7e64d9934d86aa6173229de5af5fe908662a33a.zip
cpython-d7e64d9934d86aa6173229de5af5fe908662a33a.tar.gz
cpython-d7e64d9934d86aa6173229de5af5fe908662a33a.tar.bz2
test_multiprocessing: Fix dangling process/thread (#2850)
bpo-26762: Fix more dangling processes and threads in test_multiprocessing: * Queue: call close() followed by join_thread() * Process: call join() or self.addCleanup(p.join)
-rw-r--r--Lib/test/_test_multiprocessing.py24
1 files changed, 22 insertions, 2 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index 88e2eb3..126725f 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -32,11 +32,12 @@ test.support.import_module('multiprocessing.synchronize')
# without thread support.
import threading
-import multiprocessing.dummy
import multiprocessing.connection
-import multiprocessing.managers
+import multiprocessing.dummy
import multiprocessing.heap
+import multiprocessing.managers
import multiprocessing.pool
+import multiprocessing.queues
from multiprocessing import util
@@ -64,6 +65,13 @@ except ImportError:
def latin(s):
return s.encode('latin')
+
+def close_queue(queue):
+ if isinstance(queue, multiprocessing.queues.Queue):
+ queue.close()
+ queue.join_thread()
+
+
#
# Constants
#
@@ -825,6 +833,7 @@ class _TestQueue(BaseTestCase):
self.assertEqual(q.qsize(), 1)
q.get()
self.assertEqual(q.qsize(), 0)
+ close_queue(q)
@classmethod
def _test_task_done(cls, q):
@@ -897,6 +906,7 @@ class _TestQueue(BaseTestCase):
q.put(True)
# bpo-30595: use a timeout of 1 second for slow buildbots
self.assertTrue(q.get(timeout=1.0))
+ close_queue(q)
#
#
@@ -1020,10 +1030,12 @@ class _TestCondition(BaseTestCase):
p = self.Process(target=self.f, args=(cond, sleeping, woken))
p.daemon = True
p.start()
+ self.addCleanup(p.join)
p = threading.Thread(target=self.f, args=(cond, sleeping, woken))
p.daemon = True
p.start()
+ self.addCleanup(p.join)
# wait for both children to start sleeping
sleeping.acquire()
@@ -1066,11 +1078,13 @@ class _TestCondition(BaseTestCase):
args=(cond, sleeping, woken, TIMEOUT1))
p.daemon = True
p.start()
+ self.addCleanup(p.join)
t = threading.Thread(target=self.f,
args=(cond, sleeping, woken, TIMEOUT1))
t.daemon = True
t.start()
+ self.addCleanup(t.join)
# wait for them all to sleep
for i in range(6):
@@ -1089,10 +1103,12 @@ class _TestCondition(BaseTestCase):
p = self.Process(target=self.f, args=(cond, sleeping, woken))
p.daemon = True
p.start()
+ self.addCleanup(p.join)
t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
t.daemon = True
t.start()
+ self.addCleanup(t.join)
# wait for them to all sleep
for i in range(6):
@@ -1123,10 +1139,12 @@ class _TestCondition(BaseTestCase):
p = self.Process(target=self.f, args=(cond, sleeping, woken))
p.daemon = True
p.start()
+ self.addCleanup(p.join)
t = threading.Thread(target=self.f, args=(cond, sleeping, woken))
t.daemon = True
t.start()
+ self.addCleanup(t.join)
# wait for them to all sleep
for i in range(6):
@@ -1309,6 +1327,7 @@ class _TestEvent(BaseTestCase):
p.daemon = True
p.start()
self.assertEqual(wait(), True)
+ p.join()
#
# Tests for Barrier - adapted from tests in test/lock_tests.py
@@ -1654,6 +1673,7 @@ class _TestBarrier(BaseTestCase):
p = self.Process(target=self._test_thousand_f,
args=(self.barrier, passes, child_conn, lock))
p.start()
+ self.addCleanup(p.join)
for i in range(passes):
for j in range(self.N):