Skip to content

Commit 365357c

Browse files
committed
Remove __del__ handler, fix pubsub weakref callback handling
1 parent d6a1af7 commit 365357c

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

redis/asyncio/client.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -730,15 +730,11 @@ async def __aenter__(self):
730730
async def __aexit__(self, exc_type, exc_value, traceback):
731731
await self.reset()
732732

733-
def __del__(self):
734-
if self.connection:
735-
self.connection.clear_connect_callbacks()
736-
737733
async def reset(self):
738734
async with self._lock:
739735
if self.connection:
740736
await self.connection.disconnect()
741-
self.connection.clear_connect_callbacks()
737+
self.connection.deregister_connect_callback(self.on_connect)
742738
await self.connection_pool.release(self.connection)
743739
self.connection = None
744740
self.channels = {}

redis/asyncio/connection.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,15 @@ def is_connected(self):
217217
return self._reader is not None and self._writer is not None
218218

219219
def register_connect_callback(self, callback):
220-
self._connect_callbacks.append(weakref.WeakMethod(callback))
220+
wm = weakref.WeakMethod(callback)
221+
if wm not in self._connect_callbacks:
222+
self._connect_callbacks.append(wm)
221223

222-
def clear_connect_callbacks(self):
223-
self._connect_callbacks = []
224+
def deregister_connect_callback(self, callback):
225+
try:
226+
self._connect_callbacks.remove(weakref.WeakMethod(callback))
227+
except ValueError:
228+
pass
224229

225230
def set_parser(self, parser_class: Type[BaseParser]) -> None:
226231
"""
@@ -263,6 +268,8 @@ async def connect(self):
263268

264269
# run any user callbacks. right now the only internal callback
265270
# is for pubsub channel/pattern resubscription
271+
# first, remove any dead weakrefs
272+
self._connect_callbacks = [ref for ref in self._connect_callbacks if ref()]
266273
for ref in self._connect_callbacks:
267274
callback = ref()
268275
task = callback(self)

0 commit comments

Comments
 (0)