Commit af53ead6 authored by Yury Selivanov's avatar Yury Selivanov

Issue #28370: Speedup asyncio.StreamReader.readexactly

Patch by Коренберг Марк.
parent ab485051
...@@ -448,6 +448,7 @@ class StreamReader: ...@@ -448,6 +448,7 @@ class StreamReader:
assert not self._eof, '_wait_for_data after EOF' assert not self._eof, '_wait_for_data after EOF'
# Waiting for data while paused will make deadlock, so prevent it. # Waiting for data while paused will make deadlock, so prevent it.
# This is essential for readexactly(n) for case when n > self._limit.
if self._paused: if self._paused:
self._paused = False self._paused = False
self._transport.resume_reading() self._transport.resume_reading()
...@@ -658,25 +659,22 @@ class StreamReader: ...@@ -658,25 +659,22 @@ class StreamReader:
if n == 0: if n == 0:
return b'' return b''
# There used to be "optimized" code here. It created its own while len(self._buffer) < n:
# Future and waited until self._buffer had at least the n if self._eof:
# bytes, then called read(n). Unfortunately, this could pause incomplete = bytes(self._buffer)
# the transport if the argument was larger than the pause self._buffer.clear()
# limit (which is twice self._limit). So now we just read() raise IncompleteReadError(incomplete, n)
# into a local buffer.
blocks = []
while n > 0:
block = yield from self.read(n)
if not block:
partial = b''.join(blocks)
raise IncompleteReadError(partial, len(partial) + n)
blocks.append(block)
n -= len(block)
assert n == 0 yield from self._wait_for_data('readexactly')
return b''.join(blocks) if len(self._buffer) == n:
data = bytes(self._buffer)
self._buffer.clear()
else:
data = bytes(self._buffer[:n])
del self._buffer[:n]
self._maybe_resume_transport()
return data
if compat.PY35: if compat.PY35:
@coroutine @coroutine
......
...@@ -353,6 +353,9 @@ Library ...@@ -353,6 +353,9 @@ Library
- Issue #28369: Raise RuntimeError when transport's FD is used with - Issue #28369: Raise RuntimeError when transport's FD is used with
add_reader, add_writer, etc. add_reader, add_writer, etc.
- Issue #28370: Speedup asyncio.StreamReader.readexactly.
Patch by Коренберг Марк.
IDLE IDLE
---- ----
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment