mirror of
https://github.com/python/cpython.git
synced 2025-11-25 04:34:37 +00:00
GH-106684: raise ResourceWarning when asyncio.StreamWriter is not closed (#107650)
This commit is contained in:
parent
5e2746d6e2
commit
41178e4199
3 changed files with 30 additions and 0 deletions
|
|
@ -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:
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
Raise :exc:`ResourceWarning` when :class:`asyncio.StreamWriter` is not closed leading to memory leaks. Patch by Kumar Aditya.
|
||||
Loading…
Add table
Add a link
Reference in a new issue