]> granicus.if.org Git - python/commitdiff
Issue #8428: Fix a race condition in multiprocessing.Pool when terminating
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 10 Apr 2011 22:26:42 +0000 (00:26 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 10 Apr 2011 22:26:42 +0000 (00:26 +0200)
worker processes: new processes would be spawned while the pool is being
shut down.  Patch by Charles-François Natali.

Lib/multiprocessing/pool.py
Misc/NEWS

index 1f366f035ee164bd599bceff16c35eb59b560f96..862a60e92cfae97d6902e29d495c42bf9822ad0e 100644 (file)
@@ -295,6 +295,8 @@ class Pool(object):
         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
@@ -413,7 +415,6 @@ class Pool(object):
         if self._state == RUN:
             self._state = CLOSE
             self._worker_handler._state = CLOSE
-            self._taskqueue.put(None)
 
     def terminate(self):
         debug('terminating pool')
@@ -447,7 +448,6 @@ class Pool(object):
 
         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))
@@ -457,6 +457,11 @@ class Pool(object):
         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')
index ee75bdad2c73755cb5632d2222824d14d6b41cf0..5eb38dabd821e37ef6952186997f4668c69ff7a8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -51,6 +51,10 @@ Core and Builtins
 Library
 -------
 
+- 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 #7311: fix HTMLParser to accept non-ASCII attribute values.
 
 - Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.