From: Victor Stinner Date: Wed, 21 Jan 2015 22:38:37 +0000 (+0100) Subject: asyncio: Enhance BaseProactorEventLoop._loop_self_reading() X-Git-Tag: v3.4.3rc1~107 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cd0f7f9832e6aa8363f85152810738111b9a181d;p=python asyncio: Enhance BaseProactorEventLoop._loop_self_reading() * Handle correctly CancelledError: just exit * On error, log the exception and exit Don't try to close the event loop, it is probably running and so it cannot be closed. --- diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index 6d8641feee..ed17062214 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -463,9 +463,15 @@ class BaseProactorEventLoop(base_events.BaseEventLoop): if f is not None: f.result() # may raise f = self._proactor.recv(self._ssock, 4096) - except: - self.close() - raise + except futures.CancelledError: + # _close_self_pipe() has been called, stop waiting for data + return + except Exception as exc: + self.call_exception_handler({ + 'message': 'Error on reading from the event loop self pipe', + 'exception': exc, + 'loop': self, + }) else: self._self_reading_future = f f.add_done_callback(self._loop_self_reading) diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py index dee147e557..33a8a671ec 100644 --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -523,9 +523,10 @@ class BaseProactorEventLoopTests(test_utils.TestCase): def test_loop_self_reading_exception(self): self.loop.close = mock.Mock() + self.loop.call_exception_handler = mock.Mock() self.proactor.recv.side_effect = OSError() - self.assertRaises(OSError, self.loop._loop_self_reading) - self.assertTrue(self.loop.close.called) + self.loop._loop_self_reading() + self.assertTrue(self.loop.call_exception_handler.called) def test_write_to_self(self): self.loop._write_to_self()