GH-106684: raise ResourceWarning when asyncio.StreamWriter is not closed (#107650)

This commit is contained in:
Kumar Aditya 2023-08-05 17:48:15 +05:30 committed by GitHub
parent 5e2746d6e2
commit 41178e4199
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 0 deletions

View file

@ -5,6 +5,7 @@ __all__ = (
import collections
import socket
import sys
import warnings
import weakref
if hasattr(socket, 'AF_UNIX'):
@ -392,6 +393,11 @@ class StreamWriter:
self._transport = new_transport
protocol._replace_writer(self)
def __del__(self, warnings=warnings):
if not self._transport.is_closing():
self.close()
warnings.warn(f"unclosed {self!r}", ResourceWarning)
class StreamReader:

View file

@ -1074,6 +1074,29 @@ os.close(fd)
self.assertEqual(messages, [])
def test_unclosed_resource_warnings(self):
async def inner(httpd):
rd, wr = await asyncio.open_connection(*httpd.address)
wr.write(b'GET / HTTP/1.0\r\n\r\n')
data = await rd.readline()
self.assertEqual(data, b'HTTP/1.0 200 OK\r\n')
data = await rd.read()
self.assertTrue(data.endswith(b'\r\n\r\nTest message'))
with self.assertWarns(ResourceWarning):
del wr
gc.collect()
messages = []
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
with test_utils.run_test_server() as httpd:
self.loop.run_until_complete(inner(httpd))
self.assertEqual(messages, [])
if __name__ == '__main__':
unittest.main()

View file

@ -0,0 +1 @@
Raise :exc:`ResourceWarning` when :class:`asyncio.StreamWriter` is not closed leading to memory leaks. Patch by Kumar Aditya.