From: Antoine Pitrou Date: Sun, 10 Apr 2011 22:26:42 +0000 (+0200) Subject: Issue #8428: Fix a race condition in multiprocessing.Pool when terminating X-Git-Tag: v2.7.2rc1~175 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7dfc874a48516e58e830b3a455fca34c8cd834eb;p=python 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. --- diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py index 1f366f035e..862a60e92c 100644 --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -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') diff --git a/Misc/NEWS b/Misc/NEWS index ee75bdad2c..5eb38dabd8 100644 --- 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.