From 7f65c4ccb0e954c17f2a3e1ecc665c62e4a1aaeb Mon Sep 17 00:00:00 2001 From: Andrew Chen Wang <60190294+Andrew-Chen-Wang@users.noreply.github.com> Date: Wed, 15 Dec 2021 22:15:42 -0500 Subject: [PATCH] Remove __del__ from Redis (Fixes #1115) (#1227) --- CHANGES/1227.bugfix | 1 + aioredis/client.py | 31 ++++++++++++------------------- 2 files changed, 13 insertions(+), 19 deletions(-) create mode 100644 CHANGES/1227.bugfix diff --git a/CHANGES/1227.bugfix b/CHANGES/1227.bugfix new file mode 100644 index 000000000..6fef29859 --- /dev/null +++ b/CHANGES/1227.bugfix @@ -0,0 +1 @@ +Change `__del__` in Redis to raise ResourceWarning (Fixes #1115) diff --git a/aioredis/client.py b/aioredis/client.py index 26c9ae3c7..3b5e091d5 100644 --- a/aioredis/client.py +++ b/aioredis/client.py @@ -1055,15 +1055,17 @@ async def __aenter__(self: _RedisT) -> _RedisT: async def __aexit__(self, exc_type, exc_value, traceback): await self.close() - def __del__(self): - try: - loop = asyncio.get_event_loop() - if loop.is_running(): - loop.create_task(self.close()) - else: - loop.run_until_complete(self.close()) - except Exception: - pass + _DEL_MESSAGE = "Unclosed Redis client" + + def __del__(self, _warnings: Any = warnings) -> None: + if self.connection is not None: + _warnings.warn( + f"Unclosed client session {self!r}", + ResourceWarning, + source=self, + ) + context = {"client": self, "message": self._DEL_MESSAGE} + asyncio.get_event_loop().call_exception_handler(context) async def close(self): conn = self.connection @@ -4350,16 +4352,7 @@ async def __aexit__(self, exc_type, exc_value, traceback): def __await__(self): return self._async_self().__await__() - def __del__(self): - try: - loop = asyncio.get_event_loop() - if loop.is_running(): - loop.create_task(self.reset()) - else: - loop.run_until_complete(self.reset()) - super().__del__() - except Exception: - pass + _DEL_MESSAGE = "Unclosed Pipeline client" def __len__(self): return len(self.command_stack)