[Python-checkins] cpython (3.4): asyncio: Enhance BaseProactorEventLoop._loop_self_reading()
victor.stinner
python-checkins at python.org
Wed Jan 21 23:41:53 CET 2015
https://hg.python.org/cpython/rev/d36d60d19095
changeset: 94229:d36d60d19095
branch: 3.4
parent: 94226:d1ed573a2fa3
user: Victor Stinner <victor.stinner at gmail.com>
date: Wed Jan 21 23:38:37 2015 +0100
summary:
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.
files:
Lib/asyncio/proactor_events.py | 12 +++++++--
Lib/test/test_asyncio/test_proactor_events.py | 5 ++-
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -463,9 +463,15 @@
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
--- a/Lib/test/test_asyncio/test_proactor_events.py
+++ b/Lib/test/test_asyncio/test_proactor_events.py
@@ -523,9 +523,10 @@
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()
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list