diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index a88e298973ca87..bb1e7282db8e3d 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -244,8 +244,8 @@ def _feed(buffer, notempty, send, writelock, close): else: wacquire = None - try: - while 1: + while 1: + try: nacquire() try: if not buffer: @@ -270,19 +270,17 @@ def _feed(buffer, notempty, send, writelock, close): wrelease() except IndexError: pass - except Exception, e: - # 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 - # started to cleanup. - try: + except Exception as e: + # 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 + # started to cleanup. if is_exiting(): info('error in queue thread: %s', e) + return else: import traceback traceback.print_exc() - except Exception: - pass _sentinel = object() diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py index 4d39501ccb073a..8a6bb780f540ae 100644 --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -641,6 +641,21 @@ def test_no_import_lock_contention(self): self.fail("Probable regression on import lock contention;" " see Issue #22853") + def test_queue_feeder_donot_stop_onexc(self): + # bpo-30414: verify feeder handles exceptions correctly + if self.TYPE != 'processes': + self.skipTest('test not appropriate for {}'.format(self.TYPE)) + + class NotSerializable(object): + def __reduce__(self): + raise AttributeError + with test.support.captured_stderr(): + q = self.Queue() + q.put(NotSerializable()) + q.put(True) + self.assertTrue(q.get(timeout=0.1)) + + # # # diff --git a/Misc/NEWS b/Misc/NEWS index 3c6f829f051443..ba5d5d17828890 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -49,6 +49,9 @@ Extension Modules Library ------- +- bpo-30414: multiprocessing.Queue._feed background running + thread do not break from main loop on exception. + - bpo-30003: Fix handling escape characters in HZ codec. Based on patch by Ma Lin.