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