From 8d2a7ef12bff060087bf16150dc0e70fdbad254a Mon Sep 17 00:00:00 2001 From: yungwine <94808996+yungwine@users.noreply.github.com> Date: Mon, 17 Oct 2022 19:46:21 +0600 Subject: [PATCH 1/2] fixed .close() method for TonLibClient --- ton/tonlibjson.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ton/tonlibjson.py b/ton/tonlibjson.py index 9277a1c..349f1a7 100644 --- a/ton/tonlibjson.py +++ b/ton/tonlibjson.py @@ -184,8 +184,8 @@ def _is_working(self): async def close(self): try: self._state = 'finished' - await self.read_results_task() - await self.del_expired_futures_task() + await self.read_results_task + await self.del_expired_futures_task except Exception as ee: logger.error(f"Exception in tonlibjson.close: {traceback.format_exc()}") raise RuntimeError(f'Error in tonlibjson.close: {ee}') @@ -241,4 +241,4 @@ async def del_expired_futures_loop(self): self.cancel_futures(cancel_all=True) except Exception as ee: - logger.critical(f'Task del_expired_futures_loop failed: {ee}') \ No newline at end of file + logger.critical(f'Task del_expired_futures_loop failed: {ee}') From 2b126597f55d2c2d94f514a2a51fecbe3cf2a644 Mon Sep 17 00:00:00 2001 From: yungwine <94808996+yungwine@users.noreply.github.com> Date: Tue, 25 Oct 2022 04:24:34 +0600 Subject: [PATCH 2/2] finally fixed .closed() method for TonLib there was an error in previous version. when you tried to close client there could be an error related to asynchronous sending requests: you call .close() method, it awaits for other 2 methods which can select to .send() method which crashed because of 'if not self._is_working: raise RuntimeError(f"TonLib failed with state: {self._state}")', so I fixed this adding _is_closing() method. --- ton/tonlibjson.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ton/tonlibjson.py b/ton/tonlibjson.py index 349f1a7..7dd8cf8 100644 --- a/ton/tonlibjson.py +++ b/ton/tonlibjson.py @@ -118,7 +118,6 @@ def __init__(self, loop, ls_index, cdll_path=None, verbosity_level=0): self._state = None # None, "finished", "crashed", "stuck" self.is_dead = False - # creating tasks self.read_results_task = self.loop.create_task(self.read_results()) self.del_expired_futures_task = self.loop.create_task(self.del_expired_futures_loop()) @@ -161,7 +160,6 @@ def _execute(self, query, timeout=10): future_result = self.loop.create_future() self.futures[extra_id] = future_result - self.loop.run_in_executor(None, lambda: self.send(query)) return future_result @@ -181,11 +179,16 @@ async def execute(self, query, timeout=10): def _is_working(self): return self._state not in ('crashed', 'stuck', 'finished') + @property + def _is_closing(self): + return self._state == 'finishing' + async def close(self): try: - self._state = 'finished' + self._state = 'finishing' await self.read_results_task await self.del_expired_futures_task + self._state = 'finished' except Exception as ee: logger.error(f"Exception in tonlibjson.close: {traceback.format_exc()}") raise RuntimeError(f'Error in tonlibjson.close: {ee}') @@ -207,7 +210,7 @@ async def read_results(self): delta = 5 receive_func = functools.partial(self.receive, timeout) try: - while self._is_working: + while self._is_working and not self._is_closing: # return reading result result = None try: @@ -235,7 +238,7 @@ async def read_results(self): async def del_expired_futures_loop(self): try: - while self._is_working: + while self._is_working and not self._is_closing: self.cancel_futures() await asyncio.sleep(1)