]> granicus.if.org Git - python/commitdiff
bpo-38148: Add slots to asyncio transports (GH-16077)
authorAndrew Svetlov <andrew.svetlov@gmail.com>
Fri, 13 Sep 2019 12:18:46 +0000 (15:18 +0300)
committerGitHub <noreply@github.com>
Fri, 13 Sep 2019 12:18:46 +0000 (15:18 +0300)
* bpo-38148: Add slots to asyncio transports

* Update Misc/NEWS.d/next/Library/2019-09-13-08-55-43.bpo-38148.Lnww6D.rst

Co-Authored-By: Kyle Stanley <aeros167@gmail.com>
Lib/asyncio/transports.py
Lib/test/test_asyncio/test_transports.py
Misc/NEWS.d/next/Library/2019-09-13-08-55-43.bpo-38148.Lnww6D.rst [new file with mode: 0644]

index 47b37fa9b7f0f6e55c2fb4210b9739f95632178c..513b1c024a4d6d83dfaa1fe33352e4a354a9de7d 100644 (file)
@@ -9,6 +9,8 @@ __all__ = (
 class BaseTransport:
     """Base class for transports."""
 
+    __slots__ = ('_extra',)
+
     def __init__(self, extra=None):
         if extra is None:
             extra = {}
@@ -44,6 +46,8 @@ class BaseTransport:
 class ReadTransport(BaseTransport):
     """Interface for read-only transports."""
 
+    __slots__ = ()
+
     def is_reading(self):
         """Return True if the transport is receiving."""
         raise NotImplementedError
@@ -68,6 +72,8 @@ class ReadTransport(BaseTransport):
 class WriteTransport(BaseTransport):
     """Interface for write-only transports."""
 
+    __slots__ = ()
+
     def set_write_buffer_limits(self, high=None, low=None):
         """Set the high- and low-water limits for write flow control.
 
@@ -154,10 +160,14 @@ class Transport(ReadTransport, WriteTransport):
     except writelines(), which calls write() in a loop.
     """
 
+    __slots__ = ()
+
 
 class DatagramTransport(BaseTransport):
     """Interface for datagram (UDP) transports."""
 
+    __slots__ = ()
+
     def sendto(self, data, addr=None):
         """Send data to the transport.
 
@@ -180,6 +190,8 @@ class DatagramTransport(BaseTransport):
 
 class SubprocessTransport(BaseTransport):
 
+    __slots__ = ()
+
     def get_pid(self):
         """Get subprocess id."""
         raise NotImplementedError
@@ -247,6 +259,8 @@ class _FlowControlMixin(Transport):
     resume_writing() may be called.
     """
 
+    __slots__ = ('_loop', '_protocol_paused', '_high_water', '_low_water')
+
     def __init__(self, extra=None, loop=None):
         super().__init__(extra)
         assert loop is not None
index 7de9b3e81a34ec3ff6f547c066f34ad257da72ed..df448557a7b7fcde07f7017e4015bdecb80be8ab 100644 (file)
@@ -22,14 +22,19 @@ class TransportTests(unittest.TestCase):
         self.assertIs(default, transport.get_extra_info('unknown', default))
 
     def test_writelines(self):
-        transport = asyncio.Transport()
-        transport.write = mock.Mock()
+        writer = mock.Mock()
+
+        class MyTransport(asyncio.Transport):
+            def write(self, data):
+                writer(data)
+
+        transport = MyTransport()
 
         transport.writelines([b'line1',
                               bytearray(b'line2'),
                               memoryview(b'line3')])
-        self.assertEqual(1, transport.write.call_count)
-        transport.write.assert_called_with(b'line1line2line3')
+        self.assertEqual(1, writer.call_count)
+        writer.assert_called_with(b'line1line2line3')
 
     def test_not_implemented(self):
         transport = asyncio.Transport()
diff --git a/Misc/NEWS.d/next/Library/2019-09-13-08-55-43.bpo-38148.Lnww6D.rst b/Misc/NEWS.d/next/Library/2019-09-13-08-55-43.bpo-38148.Lnww6D.rst
new file mode 100644 (file)
index 0000000..88c0809
--- /dev/null
@@ -0,0 +1 @@
+Add slots to :mod:`asyncio` transport classes, which can reduce memory usage.