Skip to content

Commit 05518ca

Browse files
committed
Remove __del__ handler, fix pubsub weakref callback handling
1 parent 460b297 commit 05518ca

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
@@ -222,10 +222,15 @@ def is_connected(self):
222222
return self._reader is not None and self._writer is not None
223223

224224
def register_connect_callback(self, callback):
225-
self._connect_callbacks.append(weakref.WeakMethod(callback))
225+
wm = weakref.WeakMethod(callback)
226+
if wm not in self._connect_callbacks:
227+
self._connect_callbacks.append(wm)
226228

227-
def clear_connect_callbacks(self):
228-
self._connect_callbacks = []
229+
def deregister_connect_callback(self, callback):
230+
try:
231+
self._connect_callbacks.remove(weakref.WeakMethod(callback))
232+
except ValueError:
233+
pass
229234

230235
def set_parser(self, parser_class: Type[BaseParser]) -> None:
231236
"""
@@ -268,6 +273,8 @@ async def connect(self):
268273

269274
# run any user callbacks. right now the only internal callback
270275
# is for pubsub channel/pattern resubscription
276+
# first, remove any dead weakrefs
277+
self._connect_callbacks = [ref for ref in self._connect_callbacks if ref()]
271278
for ref in self._connect_callbacks:
272279
callback = ref()
273280
task = callback(self)

0 commit comments

Comments
 (0)