From b082cb14fc90732e22f7e1c03add3af39712f681 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Wed, 28 Jun 2017 11:21:52 +0200 Subject: [PATCH] [3.5] bpo-30775: Fix refleaks in test_multiprocessing (GH-2467) Forgetting to call Process.join() can keep some resources alive. (cherry picked from commit a79f8faccf5e26f55e8b9496ad49d2071b5e299c) --- Lib/test/_test_multiprocessing.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 01459dc81d86df..76209f134330a1 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -1181,10 +1181,19 @@ def __init__(self, namespace, f, args, n, wait_before_exit=False): 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 @@ def wait_for_finished(self): def do_finish(self): self._can_exit.set() + def close(self): + self._finalizer() + class AppendTrue(object): def __init__(self, obj): @@ -1239,8 +1251,11 @@ def DummyList(self): 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):