summaryrefslogtreecommitdiffstats
path: root/Lib/test/_test_multiprocessing.py
diff options
context:
space:
mode:
authorAntoine Pitrou <pitrou@free.fr>2017-06-28 09:50:44 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2017-06-28 09:50:44 (GMT)
commitf15bf1f3f3104f6ab2229e4b359984489a74685b (patch)
tree2c452c754d74b8f7429d4d0fc18ef3543f2e391a /Lib/test/_test_multiprocessing.py
parent54ba940abc2fabb94fede46dfad80f8ac15632a3 (diff)
downloadcpython-f15bf1f3f3104f6ab2229e4b359984489a74685b.zip
cpython-f15bf1f3f3104f6ab2229e4b359984489a74685b.tar.gz
cpython-f15bf1f3f3104f6ab2229e4b359984489a74685b.tar.bz2
[3.5] bpo-30775: Fix refleaks in test_multiprocessing (GH-2467) (#2469)
Forgetting to call Process.join() can keep some resources alive. (cherry picked from commit a79f8faccf5e26f55e8b9496ad49d2071b5e299c)
Diffstat (limited to 'Lib/test/_test_multiprocessing.py')
-rw-r--r--Lib/test/_test_multiprocessing.py19
1 files changed, 17 insertions, 2 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index 01459dc..76209f1 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -1181,10 +1181,19 @@ class Bunch(object):
self._can_exit = namespace.Event()
if not wait_before_exit:
self._can_exit.set()
+
+ threads = []
for i in range(n):
p = namespace.Process(target=self.task)
p.daemon = True
p.start()
+ threads.append(p)
+
+ def finalize(threads):
+ for p in threads:
+ p.join()
+
+ self._finalizer = weakref.finalize(self, finalize, threads)
def task(self):
pid = os.getpid()
@@ -1207,6 +1216,9 @@ class Bunch(object):
def do_finish(self):
self._can_exit.set()
+ def close(self):
+ self._finalizer()
+
class AppendTrue(object):
def __init__(self, obj):
@@ -1239,8 +1251,11 @@ class _TestBarrier(BaseTestCase):
def run_threads(self, f, args):
b = Bunch(self, f, args, self.N-1)
- f(*args)
- b.wait_for_finished()
+ try:
+ f(*args)
+ b.wait_for_finished()
+ finally:
+ b.close()
@classmethod
def multipass(cls, barrier, results, n):