Silence spurious "broken pipe" tracebacks when shutting down a ProcessPoolExecutor.

This commit is contained in:
Antoine Pitrou 2011-07-16 01:51:58 +02:00
parent d06a065a44
commit dc19c24832
3 changed files with 17 additions and 6 deletions

View file

@ -41,6 +41,7 @@ import collections
import time
import atexit
import weakref
import errno
from queue import Empty, Full
import _multiprocessing
@ -67,6 +68,8 @@ class Queue(object):
else:
self._wlock = Lock()
self._sem = BoundedSemaphore(maxsize)
# For use by concurrent.futures
self._ignore_epipe = False
self._after_fork()
@ -178,7 +181,7 @@ class Queue(object):
self._thread = threading.Thread(
target=Queue._feed,
args=(self._buffer, self._notempty, self._send,
self._wlock, self._writer.close),
self._wlock, self._writer.close, self._ignore_epipe),
name='QueueFeederThread'
)
self._thread.daemon = True
@ -229,7 +232,7 @@ class Queue(object):
notempty.release()
@staticmethod
def _feed(buffer, notempty, send, writelock, close):
def _feed(buffer, notempty, send, writelock, close, ignore_epipe):
debug('starting thread to feed data to pipe')
from .util import is_exiting
@ -271,6 +274,8 @@ class Queue(object):
except IndexError:
pass
except Exception as e:
if ignore_epipe and getattr(e, 'errno', 0) == errno.EPIPE:
return
# Since this runs in a daemon thread the resources it uses
# may be become unusable while the process is cleaning up.
# We ignore errors which happen after the process has