Skip to content

Commit 819afc3

Browse files
committed
Remove __del__ handler, fix pubsub weakref callback handling
1 parent 8120ed5 commit 819afc3

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
@@ -720,15 +720,11 @@ async def __aenter__(self):
720720
async def __aexit__(self, exc_type, exc_value, traceback):
721721
await self.reset()
722722

723-
def __del__(self):
724-
if self.connection:
725-
self.connection.clear_connect_callbacks()
726-
727723
async def reset(self):
728724
async with self._lock:
729725
if self.connection:
730726
await self.connection.disconnect()
731-
self.connection.clear_connect_callbacks()
727+
self.connection.deregister_connect_callback(self.on_connect)
732728
await self.connection_pool.release(self.connection)
733729
self.connection = None
734730
self.channels = {}

redis/asyncio/connection.py

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

218218
def register_connect_callback(self, callback):
219-
self._connect_callbacks.append(weakref.WeakMethod(callback))
219+
wm = weakref.WeakMethod(callback)
220+
if wm not in self._connect_callbacks:
221+
self._connect_callbacks.append(wm)
220222

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

224229
def set_parser(self, parser_class: Type[BaseParser]) -> None:
225230
"""
@@ -262,6 +267,8 @@ async def connect(self):
262267

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

0 commit comments

Comments
 (0)