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.
This commit is contained in:
Antoine Pitrou 2011-04-11 00:18:59 +02:00
parent 810b94a364
commit 81dee6b4d4
2 changed files with 11 additions and 2 deletions

View File

@ -322,6 +322,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
@ -440,7 +442,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')
@ -474,7 +475,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))
@ -484,6 +484,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')

View File

@ -53,6 +53,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 html.parser to accept non-ASCII attribute values.
- Issue #11605: email.parser.BytesFeedParser was incorrectly converting multipart