]> granicus.if.org Git - python/commitdiff
Issue #20540: Fix a performance regression (vs. Python 3.2) when layering a multiproc...
authorAntoine Pitrou <solipsis@pitrou.net>
Sat, 8 Feb 2014 22:03:56 +0000 (23:03 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Sat, 8 Feb 2014 22:03:56 +0000 (23:03 +0100)
For small payloads, Nagle's algorithm would introduce idle delays before the entire transmission of a message.

Lib/multiprocessing/connection.py
Misc/NEWS

index 2a0bc2fa726551049ef1df57d425800bb6770f7f..22589d0422cf7aace53b30cc8f3c31348bbbd9c9 100644 (file)
@@ -395,13 +395,23 @@ class Connection(_ConnectionBase):
         return buf
 
     def _send_bytes(self, buf):
-        # For wire compatibility with 3.2 and lower
         n = len(buf)
-        self._send(struct.pack("!i", n))
-        # The condition is necessary to avoid "broken pipe" errors
-        # when sending a 0-length buffer if the other end closed the pipe.
-        if n > 0:
-            self._send(buf)
+        # For wire compatibility with 3.2 and lower
+        header = struct.pack("!i", n)
+        if n > 16384:
+            # The payload is large so Nagle's algorithm won't be triggered
+            # and we'd better avoid the cost of concatenation.
+            chunks = [header, buf]
+        elif n > 0:
+            # Issue # 20540: concatenate before sending, to avoid delays due
+            # to Nagle's algorithm on a TCP socket.
+            chunks = [header + buf]
+        else:
+            # This code path is necessary to avoid "broken pipe" errors
+            # when sending a 0-length buffer if the other end closed the pipe.
+            chunks = [header]
+        for chunk in chunks:
+            self._send(chunk)
 
     def _recv_bytes(self, maxsize=None):
         buf = self._recv(4)
index 3ee074392b77a602fcb8ce1d9a9bebfd309a4e96..fd89776f31323caa8095e66a4c9c3ef8c84a8a69 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -48,6 +48,11 @@ Core and Builtins
 Library
 -------
 
+- Issue #20540: Fix a performance regression (vs. Python 3.2) when layering
+  a multiprocessing Connection over a TCP socket.  For small payloads, Nagle's
+  algorithm would introduce idle delays before the entire transmission of a
+  message.
+
 - Issue #16983: the new email header parsing code will now decode encoded words
   that are (incorrectly) surrounded by quotes, and register a defect.