[3.6] bpo-30775: Fix refleaks in test_multiprocessing (GH-2467) (#2468)

Forgetting to call Process.join() can keep some resources alive.
(cherry picked from commit a79f8faccf)
This commit is contained in:
Antoine Pitrou 2017-06-28 11:49:38 +02:00 committed by GitHub
parent 0834905d9b
commit e022aad73a

View file

@ -1181,10 +1181,19 @@ class Bunch(object):
self._can_exit = namespace.Event() self._can_exit = namespace.Event()
if not wait_before_exit: if not wait_before_exit:
self._can_exit.set() self._can_exit.set()
threads = []
for i in range(n): for i in range(n):
p = namespace.Process(target=self.task) p = namespace.Process(target=self.task)
p.daemon = True p.daemon = True
p.start() p.start()
threads.append(p)
def finalize(threads):
for p in threads:
p.join()
self._finalizer = weakref.finalize(self, finalize, threads)
def task(self): def task(self):
pid = os.getpid() pid = os.getpid()
@ -1207,6 +1216,9 @@ class Bunch(object):
def do_finish(self): def do_finish(self):
self._can_exit.set() self._can_exit.set()
def close(self):
self._finalizer()
class AppendTrue(object): class AppendTrue(object):
def __init__(self, obj): def __init__(self, obj):
@ -1239,8 +1251,11 @@ class _TestBarrier(BaseTestCase):
def run_threads(self, f, args): def run_threads(self, f, args):
b = Bunch(self, f, args, self.N-1) b = Bunch(self, f, args, self.N-1)
f(*args) try:
b.wait_for_finished() f(*args)
b.wait_for_finished()
finally:
b.close()
@classmethod @classmethod
def multipass(cls, barrier, results, n): def multipass(cls, barrier, results, n):