(original) (raw)
changeset: 69236:d5e43afeede6 branch: 3.2 parent: 69232:87d89f767b23 user: Antoine Pitrou solipsis@pitrou.net date: Mon Apr 11 00🔞59 2011 +0200 files: Lib/multiprocessing/pool.py Misc/NEWS description: 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 -r 87d89f767b23 -r d5e43afeede6 Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py Sun Apr 10 09:30:04 2011 +0200 +++ b/Lib/multiprocessing/pool.py Mon Apr 11 00🔞59 2011 +0200 @@ -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') diff -r 87d89f767b23 -r d5e43afeede6 Misc/NEWS --- a/Misc/NEWS Sun Apr 10 09:30:04 2011 +0200 +++ b/Misc/NEWS Mon Apr 11 00🔞59 2011 +0200 @@ -53,6 +53,10 @@ 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 html.parser to accept non-ASCII attribute values. - Issue #11605: email.parser.BytesFeedParser was incorrectly converting multipart /solipsis@pitrou.net