Index: Lib/multiprocessing/pool.py =================================================================== --- Lib/multiprocessing/pool.py (revision 82778) +++ Lib/multiprocessing/pool.py (working copy) @@ -16,6 +16,7 @@ import Queue import itertools import collections +import sys import time from multiprocessing import Process, cpu_count, TimeoutError @@ -108,8 +109,8 @@ self._repopulate_pool() self._worker_handler = threading.Thread( - target=Pool._handle_workers, - args=(self, ) + target=Pool._make_shutdown_safe, + args=(Pool._handle_workers, self, ) ) self._worker_handler.daemon = True self._worker_handler._state = RUN @@ -117,16 +118,16 @@ self._task_handler = threading.Thread( - target=Pool._handle_tasks, - args=(self._taskqueue, self._quick_put, self._outqueue, self._pool) + target=Pool._make_shutdown_safe, + args=(Pool._handle_tasks, self._taskqueue, self._quick_put, self._outqueue, self._pool) ) self._task_handler.daemon = True self._task_handler._state = RUN self._task_handler.start() self._result_handler = threading.Thread( - target=Pool._handle_results, - args=(self._outqueue, self._quick_get, self._cache) + target=Pool._make_shutdown_safe, + args=(Pool._handle_results, self._outqueue, self._quick_get, self._cache) ) self._result_handler.daemon = True self._result_handler._state = RUN @@ -265,6 +266,18 @@ return result @staticmethod + def _make_shutdown_safe(fn, *args, **kwargs): + ''' + Run a method, ignoring any errors raised during interpreter shutdown + ''' + modules = sys.modules + try: + fn(*args, **kwargs) + except: + if modules: + raise + + @staticmethod def _handle_workers(pool): while pool._worker_handler._state == RUN and pool._state == RUN: pool._maintain_pool()