Skip to content

Commit 41178e4

Browse files
GH-106684: raise ResourceWarning when asyncio.StreamWriter is not closed (#107650)
1 parent 5e2746d commit 41178e4

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

Lib/asyncio/streams.py

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import collections
66
import socket
77
import sys
8+
import warnings
89
import weakref
910

1011
if hasattr(socket, 'AF_UNIX'):
@@ -392,6 +393,11 @@ async def start_tls(self, sslcontext, *,
392393
self._transport = new_transport
393394
protocol._replace_writer(self)
394395

396+
def __del__(self, warnings=warnings):
397+
if not self._transport.is_closing():
398+
self.close()
399+
warnings.warn(f"unclosed {self!r}", ResourceWarning)
400+
395401

396402
class StreamReader:
397403

Lib/test/test_asyncio/test_streams.py

+23
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,29 @@ def test_eof_feed_when_closing_writer(self):
10741074

10751075
self.assertEqual(messages, [])
10761076

1077+
def test_unclosed_resource_warnings(self):
1078+
async def inner(httpd):
1079+
rd, wr = await asyncio.open_connection(*httpd.address)
1080+
1081+
wr.write(b'GET / HTTP/1.0\r\n\r\n')
1082+
data = await rd.readline()
1083+
self.assertEqual(data, b'HTTP/1.0 200 OK\r\n')
1084+
data = await rd.read()
1085+
self.assertTrue(data.endswith(b'\r\n\r\nTest message'))
1086+
with self.assertWarns(ResourceWarning):
1087+
del wr
1088+
gc.collect()
1089+
1090+
1091+
messages = []
1092+
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
1093+
1094+
with test_utils.run_test_server() as httpd:
1095+
self.loop.run_until_complete(inner(httpd))
1096+
1097+
self.assertEqual(messages, [])
1098+
1099+
10771100

10781101
if __name__ == '__main__':
10791102
unittest.main()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Raise :exc:`ResourceWarning` when :class:`asyncio.StreamWriter` is not closed leading to memory leaks. Patch by Kumar Aditya.

0 commit comments

Comments
 (0)