mirror of
https://github.com/python/cpython.git
synced 2025-09-29 11:45:57 +00:00
[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:
parent
0834905d9b
commit
e022aad73a
1 changed files with 17 additions and 2 deletions
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue