From 1e17e114dae791b087a62a33ccfd3ea2272bcbce Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Mon, 10 Feb 2025 18:19:53 +0200 Subject: [PATCH 1/3] Moves the closing of the new event loop in Dendrite.query to the close session. --- bittensor/core/dendrite.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/bittensor/core/dendrite.py b/bittensor/core/dendrite.py index d314a7cede..8020fd3730 100644 --- a/bittensor/core/dendrite.py +++ b/bittensor/core/dendrite.py @@ -163,7 +163,7 @@ async def session(self) -> aiohttp.ClientSession: self._session = aiohttp.ClientSession() return self._session - def close_session(self): + def close_session(self, using_new_loop: bool = False): """ Closes the internal `aiohttp `_ client session synchronously. @@ -171,6 +171,10 @@ def close_session(self): resources like open connections and internal buffers. It is crucial for preventing resource leakage and should be called when the dendrite instance is no longer in use, especially in synchronous contexts. + Arguments: + using_new_loop: A flag to determine whether this has been called with a new event loop rather than + the default. This will indicate whether to close this event loop at the end of this call. + Note: This method utilizes asyncio's event loop to close the session asynchronously from a synchronous context. It is advisable to use this method only when asynchronous context management is not feasible. @@ -188,6 +192,8 @@ def close_session(self): if self._session: loop = asyncio.get_event_loop() loop.run_until_complete(self._session.close()) + if using_new_loop: + loop.close() self._session = None async def aclose_session(self): @@ -374,6 +380,7 @@ def query( category=DeprecationWarning, ) result = None + use_new_loop = False try: loop = asyncio.get_event_loop() result = loop.run_until_complete(self.forward(*args, **kwargs)) @@ -381,9 +388,9 @@ def query( new_loop = asyncio.new_event_loop() asyncio.set_event_loop(new_loop) result = new_loop.run_until_complete(self.forward(*args, **kwargs)) - new_loop.close() + use_new_loop = True finally: - self.close_session() + self.close_session(using_new_loop=use_new_loop) return result # type: ignore async def forward( From a4f3d12c00a1b8f348c484fcbc183c1dac18870e Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Mon, 10 Feb 2025 18:21:49 +0200 Subject: [PATCH 2/3] Add logging. --- bittensor/core/dendrite.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bittensor/core/dendrite.py b/bittensor/core/dendrite.py index 8020fd3730..10b10f681b 100644 --- a/bittensor/core/dendrite.py +++ b/bittensor/core/dendrite.py @@ -384,7 +384,8 @@ def query( try: loop = asyncio.get_event_loop() result = loop.run_until_complete(self.forward(*args, **kwargs)) - except Exception: + except Exception as e: + logging.debug(f"Exception encountered while running Dendrite.query initially: {e}") new_loop = asyncio.new_event_loop() asyncio.set_event_loop(new_loop) result = new_loop.run_until_complete(self.forward(*args, **kwargs)) From c944235bbf94ceb133f3c29ef4c1a6c8bed64913 Mon Sep 17 00:00:00 2001 From: Benjamin Himes Date: Mon, 10 Feb 2025 18:27:31 +0200 Subject: [PATCH 3/3] Ruff --- bittensor/core/dendrite.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bittensor/core/dendrite.py b/bittensor/core/dendrite.py index 10b10f681b..ef1992ac4b 100644 --- a/bittensor/core/dendrite.py +++ b/bittensor/core/dendrite.py @@ -385,7 +385,9 @@ def query( loop = asyncio.get_event_loop() result = loop.run_until_complete(self.forward(*args, **kwargs)) except Exception as e: - logging.debug(f"Exception encountered while running Dendrite.query initially: {e}") + logging.debug( + f"Exception encountered while running Dendrite.query initially: {e}" + ) new_loop = asyncio.new_event_loop() asyncio.set_event_loop(new_loop) result = new_loop.run_until_complete(self.forward(*args, **kwargs))