summaryrefslogtreecommitdiffstats
path: root/Lib/asyncio
diff options
context:
space:
mode:
authorAndrew Svetlov <andrew.svetlov@gmail.com>2018-12-03 19:08:13 (GMT)
committerGitHub <noreply@github.com>2018-12-03 19:08:13 (GMT)
commit3bc0ebab17bf5a2c29d2214743c82034f82e6573 (patch)
tree4dd0d06eb85963408b9d811b19d07116a51a70c7 /Lib/asyncio
parent3bb150d8148e3cc08418077a58f43e064b9fde61 (diff)
downloadcpython-3bc0ebab17bf5a2c29d2214743c82034f82e6573.zip
cpython-3bc0ebab17bf5a2c29d2214743c82034f82e6573.tar.gz
cpython-3bc0ebab17bf5a2c29d2214743c82034f82e6573.tar.bz2
bpo-35380: Enable TCP_NODELAY for proactor event loop (#10867)
Diffstat (limited to 'Lib/asyncio')
-rw-r--r--Lib/asyncio/base_events.py11
-rw-r--r--Lib/asyncio/proactor_events.py6
-rw-r--r--Lib/asyncio/selector_events.py13
3 files changed, 17 insertions, 13 deletions
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index f5ab6e7..60a189b 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -168,6 +168,17 @@ def _run_until_complete_cb(fut):
futures._get_loop(fut).stop()
+if hasattr(socket, 'TCP_NODELAY'):
+ def _set_nodelay(sock):
+ if (sock.family in {socket.AF_INET, socket.AF_INET6} and
+ sock.type == socket.SOCK_STREAM and
+ sock.proto == socket.IPPROTO_TCP):
+ sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+else:
+ def _set_nodelay(sock):
+ pass
+
+
class _SendfileFallbackProtocol(protocols.Protocol):
def __init__(self, transp):
if not isinstance(transp, transports._FlowControlMixin):
diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py
index ad23918..69d96a8 100644
--- a/Lib/asyncio/proactor_events.py
+++ b/Lib/asyncio/proactor_events.py
@@ -13,7 +13,6 @@ import warnings
from . import base_events
from . import constants
-from . import events
from . import futures
from . import exceptions
from . import protocols
@@ -445,6 +444,11 @@ class _ProactorSocketTransport(_ProactorReadPipeTransport,
_sendfile_compatible = constants._SendfileMode.TRY_NATIVE
+ def __init__(self, loop, sock, protocol, waiter=None,
+ extra=None, server=None):
+ super().__init__(loop, sock, protocol, waiter, extra, server)
+ base_events._set_nodelay(sock)
+
def _set_extra(self, sock):
self._extra['socket'] = sock
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
index ad09300..112c4b1 100644
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -39,17 +39,6 @@ def _test_selector_event(selector, fd, event):
return bool(key.events & event)
-if hasattr(socket, 'TCP_NODELAY'):
- def _set_nodelay(sock):
- if (sock.family in {socket.AF_INET, socket.AF_INET6} and
- sock.type == socket.SOCK_STREAM and
- sock.proto == socket.IPPROTO_TCP):
- sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
-else:
- def _set_nodelay(sock):
- pass
-
-
class BaseSelectorEventLoop(base_events.BaseEventLoop):
"""Selector event loop.
@@ -742,7 +731,7 @@ class _SelectorSocketTransport(_SelectorTransport):
# Disable the Nagle algorithm -- small writes will be
# sent without waiting for the TCP ACK. This generally
# decreases the latency (in some cases significantly.)
- _set_nodelay(self._sock)
+ base_events._set_nodelay(self._sock)
self._loop.call_soon(self._protocol.connection_made, self)
# only start reading when connection_made() has been called