diff options
author | Andrew Svetlov <andrew.svetlov@gmail.com> | 2018-12-03 19:08:13 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-03 19:08:13 (GMT) |
commit | 3bc0ebab17bf5a2c29d2214743c82034f82e6573 (patch) | |
tree | 4dd0d06eb85963408b9d811b19d07116a51a70c7 /Lib/asyncio | |
parent | 3bb150d8148e3cc08418077a58f43e064b9fde61 (diff) | |
download | cpython-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.py | 11 | ||||
-rw-r--r-- | Lib/asyncio/proactor_events.py | 6 | ||||
-rw-r--r-- | Lib/asyncio/selector_events.py | 13 |
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 |