diff --git a/blivedm/clients/ws_base.py b/blivedm/clients/ws_base.py index bae3464..612e609 100644 --- a/blivedm/clients/ws_base.py +++ b/blivedm/clients/ws_base.py @@ -105,7 +105,7 @@ class WebSocketClientBase: self._need_init_room = True self._handler: Optional[handlers.HandlerInterface] = None """消息处理器""" - self._get_reconnect_interval: Callable[[int], float] = DEFAULT_RECONNECT_POLICY + self._get_reconnect_interval: Callable[[int, int], float] = DEFAULT_RECONNECT_POLICY """重连间隔时间增长策略""" # 在调用init_room后初始化的字段 @@ -144,11 +144,11 @@ class WebSocketClientBase: """ self._handler = handler - def set_reconnect_policy(self, get_reconnect_interval: Callable[[int], float]): + def set_reconnect_policy(self, get_reconnect_interval: Callable[[int, int], float]): """ 设置重连间隔时间增长策略 - :param get_reconnect_interval: 一个可调用对象,输入重试次数,返回间隔时间 + :param get_reconnect_interval: 一个可调用对象,输入重试次数 (retry_count, total_retry_count),返回间隔时间 """ self._get_reconnect_interval = get_reconnect_interval @@ -258,7 +258,9 @@ class WebSocketClientBase: """ 网络协程,负责连接服务器、接收消息、解包 """ + # retry_count在连接成功后会重置为0,total_retry_count不会 retry_count = 0 + total_retry_count = 0 while True: try: await self._on_before_ws_connect(retry_count) @@ -292,8 +294,12 @@ class WebSocketClientBase: # 准备重连 retry_count += 1 - logger.warning('room=%d is reconnecting, retry_count=%d', self.room_id, retry_count) - await asyncio.sleep(self._get_reconnect_interval(retry_count)) + total_retry_count += 1 + logger.warning( + 'room=%d is reconnecting, retry_count=%d, total_retry_count=%d', + self.room_id, retry_count, total_retry_count + ) + await asyncio.sleep(self._get_reconnect_interval(retry_count, total_retry_count)) async def _on_before_ws_connect(self, retry_count): """ diff --git a/blivedm/utils.py b/blivedm/utils.py index 3ee78d1..2c66f6a 100644 --- a/blivedm/utils.py +++ b/blivedm/utils.py @@ -5,13 +5,13 @@ USER_AGENT = ( def make_constant_retry_policy(interval: float): - def get_interval(_retry_count: int): + def get_interval(_retry_count: int, _total_retry_count: int): return interval return get_interval def make_linear_retry_policy(start_interval: float, interval_step: float, max_interval: float): - def get_interval(retry_count: int): + def get_interval(retry_count: int, _total_retry_count: int): return min( start_interval + (retry_count - 1) * interval_step, max_interval