[Python-checkins] cpython (merge 3.2 -> default): Merge from 3.2 (issue #11814, issue #8428)

antoine.pitrou python-checkins at python.org
Mon Apr 11 00:23:38 CEST 2011


http://hg.python.org/cpython/rev/76a3fc180ce0
changeset:   69238:76a3fc180ce0
parent:      69235:00bfad341323
parent:      69237:c046b7e1087b
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Mon Apr 11 00:22:08 2011 +0200
summary:
  Merge from 3.2 (issue #11814, issue #8428)

files:
  Lib/multiprocessing/pool.py |  11 ++++++++---
  Misc/NEWS                   |   6 ++++++
  2 files changed, 14 insertions(+), 3 deletions(-)


diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
--- a/Lib/multiprocessing/pool.py
+++ b/Lib/multiprocessing/pool.py
@@ -322,6 +322,8 @@
         while pool._worker_handler._state == RUN and pool._state == RUN:
             pool._maintain_pool()
             time.sleep(0.1)
+        # send sentinel to stop workers
+        pool._taskqueue.put(None)
         debug('worker handler exiting')
 
     @staticmethod
@@ -440,7 +442,6 @@
         if self._state == RUN:
             self._state = CLOSE
             self._worker_handler._state = CLOSE
-            self._taskqueue.put(None)
 
     def terminate(self):
         debug('terminating pool')
@@ -474,7 +475,6 @@
 
         worker_handler._state = TERMINATE
         task_handler._state = TERMINATE
-        taskqueue.put(None)                 # sentinel
 
         debug('helping task handler/workers to finish')
         cls._help_stuff_finish(inqueue, task_handler, len(pool))
@@ -484,6 +484,11 @@
         result_handler._state = TERMINATE
         outqueue.put(None)                  # sentinel
 
+        # We must wait for the worker handler to exit before terminating
+        # workers because we don't want workers to be restarted behind our back.
+        debug('joining worker handler')
+        worker_handler.join()
+
         # Terminate workers which haven't already finished.
         if pool and hasattr(pool[0], 'terminate'):
             debug('terminating workers')
@@ -495,7 +500,7 @@
         task_handler.join()
 
         debug('joining result handler')
-        task_handler.join()
+        result_handler.join()
 
         if pool and hasattr(pool[0], 'terminate'):
             debug('joining pool workers')
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -98,6 +98,12 @@
 Library
 -------
 
+- Issue #11814: Fix likely typo in multiprocessing.Pool._terminate().
+
+- Issue #8428: Fix a race condition in multiprocessing.Pool when terminating
+  worker processes: new processes would be spawned while the pool is being
+  shut down.  Patch by Charles-François Natali.
+
 - Issue #2650: re.escape() no longer escapes the '_'.
 
 - Issue #11757: select.select() now raises ValueError when a negative timeout

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list