]> granicus.if.org Git - python/commitdiff
http://bugs.python.org/issue6192
authorKristján Valur Jónsson <kristjan@ccpgames.com>
Sun, 7 Jun 2009 16:43:23 +0000 (16:43 +0000)
committerKristján Valur Jónsson <kristjan@ccpgames.com>
Sun, 7 Jun 2009 16:43:23 +0000 (16:43 +0000)
Add a feature to disable the Nagle algorithm on sockets in TCPServer

Doc/library/socketserver.rst
Lib/SocketServer.py

index 078f21682b7fffe9401ad25b50550a5b1f1cb6eb..bf93cce8754035b73d403dfd0960b5df33fe29be 100644 (file)
@@ -223,6 +223,15 @@ The server classes support the following class variables:
    desired.  If :meth:`handle_request` receives no incoming requests within the
    timeout period, the :meth:`handle_timeout` method is called.
 
+.. attribute:: TCPServer.disable_nagle_algorithm
+
+   If set to True, it will set the TCP_NODELAY attribute of new requests
+   connections.  This can help alleviate problems with latency in
+   request-response type applications.  To avoid sending many small packets,
+   this option should be used only when bufferning output, such as when
+   setting :attr:`StreamRequestHandler.wbufsize` attribute to -1.
+
+   .. versionadded:: 2.7
 
 There are various server methods that can be overridden by subclasses of base
 server classes like :class:`TCPServer`; these methods aren't useful to external
index f01cb5f2ccbf58c51357b6da846a4be68c6a6bb1..5f8facce162af361cf5dc10f5814d31dfb5166ad 100644 (file)
@@ -374,6 +374,7 @@ class TCPServer(BaseServer):
     - socket_type
     - request_queue_size (only for stream sockets)
     - allow_reuse_address
+    - disable_nagle_algorithm
 
     Instance variables:
 
@@ -391,6 +392,8 @@ class TCPServer(BaseServer):
 
     allow_reuse_address = False
 
+    disable_nagle_algorithm = False
+
     def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
         """Constructor.  May be extended, do not override."""
         BaseServer.__init__(self, server_address, RequestHandlerClass)
@@ -441,7 +444,10 @@ class TCPServer(BaseServer):
         May be overridden.
 
         """
-        return self.socket.accept()
+        request = self.socket.accept()
+        if self.disable_nagle_algorithm:
+            request[0].setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)
+        return request
 
     def close_request(self, request):
         """Called to clean up an individual request."""