"""请求间隔控制器,支持取消信号中断等待。""" import random import time import threading class RateLimiter: """请求间隔控制器,在相邻 API 请求之间插入随机等待时间,防止触发上游风控。 等待期间以 0.5s 为单位轮询 cancel_event,支持快速响应取消信号。 """ def __init__(self, min_interval: float = 5.0, max_interval: float = 20.0): if min_interval > max_interval: raise ValueError( f"min_interval({min_interval}) 不能大于 max_interval({max_interval})" ) self._min = min_interval self._max = max_interval self._last_interval: float = 0.0 def wait(self, cancel_event: threading.Event | None = None) -> bool: """等待随机间隔。返回 False 表示被取消信号中断。 将等待时间拆分为 0.5s 小段,每段检查 cancel_event, 以便在取消信号到达时快速退出(最多延迟 0.5s)。 """ interval = random.uniform(self._min, self._max) self._last_interval = interval remaining = interval while remaining > 0: if cancel_event and cancel_event.is_set(): return False sleep_time = min(0.5, remaining) time.sleep(sleep_time) remaining -= sleep_time return True @property def last_interval(self) -> float: """最近一次 wait() 生成的随机间隔值。""" return self._last_interval