From edf82ff6d6f1bdf357745ba474bb181a74ba2214 Mon Sep 17 00:00:00 2001 From: Winterflower Date: Sun, 12 Feb 2017 19:28:00 +0000 Subject: [PATCH] Bug-19675 Pool does not cleanup excesive workers --- Lib/multiprocessing/pool.py | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index ffdf426..7aa396b 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -220,19 +220,31 @@ class Pool(object): """Bring the number of pool processes up to the specified number, for use after reaping workers which have exited. """ - for i in range(self._processes - len(self._pool)): - w = self.Process(target=worker, - args=(self._inqueue, self._outqueue, - self._initializer, - self._initargs, self._maxtasksperchild, - self._wrap_exception) - ) - self._pool.append(w) - w.name = w.name.replace('Process', 'PoolWorker') - w.daemon = True - w.start() - util.debug('added worker') + try: + for i in range(self._processes - len(self._pool)): + w = self.Process(target=worker, + args=(self._inqueue, self._outqueue, + self._initializer, + self._initargs, self._maxtasksperchild) + ) + self._pool.append(w) + w.name = w.name.replace('Process', 'PoolWorker') + w.daemon = True + w.start() + util.debug('added worker') + except: + debug("Process creation error. Cleaning-up (%d) workers." % (len(self._pool))) + + for process in self._pool: + if process.is_alive() is False: + continue + + process.terminate() + process.join() + util.debug("Processing cleaning-up. Bubbling error.") + raise + def _maintain_pool(self): """Clean up any exited workers and start replacements for them. """ -- 2.7.4