[Python-checkins] cpython: asyncio (Tulip issue 110): StreamReader.read() and StreamReader.readline() now
victor.stinner
python-checkins at python.org
Thu Jan 23 17:41:42 CET 2014
http://hg.python.org/cpython/rev/fca191908d24
changeset: 88661:fca191908d24
user: Victor Stinner <victor.stinner at gmail.com>
date: Thu Jan 23 17:40:03 2014 +0100
summary:
asyncio (Tulip issue 110): StreamReader.read() and StreamReader.readline() now
raise a RuntimeError, instead of using an assertion, if another coroutine is
already waiting for incoming data
files:
Lib/asyncio/streams.py | 21 ++++++++++++++-------
1 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py
--- a/Lib/asyncio/streams.py
+++ b/Lib/asyncio/streams.py
@@ -21,7 +21,7 @@
"""A wrapper for create_connection() returning a (reader, writer) pair.
The reader returned is a StreamReader instance; the writer is a
- StreamWriter.
+ StreamWriter instance.
The arguments are all the usual arguments to create_connection()
except protocol_factory; most common are positional host and port,
@@ -284,6 +284,16 @@
else:
self._paused = True
+ def _create_waiter(self, func_name):
+ # StreamReader uses a future to link the protocol feed_data() method
+ # to a read coroutine. Running two read coroutines at the same time
+ # would have an unexpected behaviour. It would not possible to know
+ # which coroutine would get the next data.
+ if self._waiter is not None:
+ raise RuntimeError('%s() called while another coroutine is '
+ 'already waiting for incoming data' % func_name)
+ return futures.Future(loop=self._loop)
+
@tasks.coroutine
def readline(self):
if self._exception is not None:
@@ -318,8 +328,7 @@
break
if not_enough:
- assert self._waiter is None
- self._waiter = futures.Future(loop=self._loop)
+ self._waiter = self._create_waiter('readline')
try:
yield from self._waiter
finally:
@@ -341,16 +350,14 @@
if n < 0:
while not self._eof:
- assert not self._waiter
- self._waiter = futures.Future(loop=self._loop)
+ self._waiter = self._create_waiter('read')
try:
yield from self._waiter
finally:
self._waiter = None
else:
if not self._byte_count and not self._eof:
- assert not self._waiter
- self._waiter = futures.Future(loop=self._loop)
+ self._waiter = self._create_waiter('read')
try:
yield from self._waiter
finally:
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list