Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Optimize asyncio UDP speed for selector events
  • Loading branch information
msoxzw authored Apr 12, 2022
commit 1fe61805d9382ceca603b905894ccb838e082f68
6 changes: 5 additions & 1 deletion Lib/asyncio/selector_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -1131,6 +1131,7 @@ def __init__(self, loop, sock, protocol, address=None,
waiter=None, extra=None):
super().__init__(loop, sock, protocol, extra)
self._address = address
self._buffer_size = 0
self._loop.call_soon(self._protocol.connection_made, self)
# only start reading when connection_made() has been called
self._loop.call_soon(self._add_reader,
Expand All @@ -1141,7 +1142,7 @@ def __init__(self, loop, sock, protocol, address=None,
waiter, None)

def get_write_buffer_size(self):
return sum(len(data) for data, _ in self._buffer)
return self._buffer_size

def _read_ready(self):
if self._conn_lost:
Expand Down Expand Up @@ -1200,18 +1201,21 @@ def sendto(self, data, addr=None):

# Ensure that what we buffer is immutable.
self._buffer.append((bytes(data), addr))
self._buffer_size += len(data)
self._maybe_pause_protocol()

def _sendto_ready(self):
while self._buffer:
data, addr = self._buffer.popleft()
self._buffer_size -= len(data)
try:
if self._extra['peername']:
self._sock.send(data)
else:
self._sock.sendto(data, addr)
except (BlockingIOError, InterruptedError):
self._buffer.appendleft((data, addr)) # Try again later.
self._buffer_size += len(data)
break
except OSError as exc:
self._protocol.error_received(exc)
Expand Down