bpo-30775: Fix refleaks in test_multiprocessing (#2467)

Forgetting to call Process.join() can keep some resources alive.
This commit is contained in:
Antoine Pitrou 2017-06-28 11:21:52 +02:00 committed by Victor Stinner
parent ccdc09ed1e
commit a79f8faccf
1 changed files with 17 additions and 2 deletions

View File

@ -1253,10 +1253,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()
@ -1279,6 +1288,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):
@ -1311,8 +1323,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):