可配置重连间隔时间

This commit is contained in:
John Smith 2023-09-15 22:14:25 +08:00
parent fc98b1a699
commit 4351881f2e
2 changed files with 29 additions and 1 deletions

View File

@ -76,6 +76,9 @@ class AuthError(Exception):
"""认证失败""" """认证失败"""
DEFAULT_RECONNECT_POLICY = utils.make_constant_retry_policy(1)
class WebSocketClientBase: class WebSocketClientBase:
""" """
基于WebSocket的客户端 基于WebSocket的客户端
@ -102,6 +105,8 @@ class WebSocketClientBase:
self._need_init_room = True self._need_init_room = True
self._handler: Optional[handlers.HandlerInterface] = None self._handler: Optional[handlers.HandlerInterface] = None
"""消息处理器""" """消息处理器"""
self._get_reconnect_interval: Callable[[int], float] = DEFAULT_RECONNECT_POLICY
"""重连间隔时间增长策略"""
# 在调用init_room后初始化的字段 # 在调用init_room后初始化的字段
self._room_id: Optional[int] = None self._room_id: Optional[int] = None
@ -139,6 +144,14 @@ class WebSocketClientBase:
""" """
self._handler = handler self._handler = handler
def set_reconnect_policy(self, get_reconnect_interval: Callable[[int], float]):
"""
设置重连间隔时间增长策略
:param get_reconnect_interval: 一个可调用对象输入重试次数返回间隔时间
"""
self._get_reconnect_interval = get_reconnect_interval
def start(self): def start(self):
""" """
启动本客户端 启动本客户端
@ -280,7 +293,7 @@ class WebSocketClientBase:
# 准备重连 # 准备重连
retry_count += 1 retry_count += 1
logger.warning('room=%d is reconnecting, retry_count=%d', self.room_id, retry_count) logger.warning('room=%d is reconnecting, retry_count=%d', self.room_id, retry_count)
await asyncio.sleep(1) await asyncio.sleep(self._get_reconnect_interval(retry_count))
async def _on_before_ws_connect(self, retry_count): async def _on_before_ws_connect(self, retry_count):
""" """

View File

@ -2,3 +2,18 @@
USER_AGENT = ( USER_AGENT = (
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
) )
def make_constant_retry_policy(interval: float):
def get_interval(_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):
return min(
start_interval + (retry_count - 1) * interval_step,
max_interval
)
return get_interval