mirror of https://github.com/python/cpython
bpo-30775: Fix refleaks in test_multiprocessing (#2467)
Forgetting to call Process.join() can keep some resources alive.
This commit is contained in:
parent
ccdc09ed1e
commit
a79f8faccf
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue