微信小程序页面迁移校验之前 P5任务处理之前
This commit is contained in:
43
apps/etl/connectors/feiqiu/api/rate_limiter.py
Normal file
43
apps/etl/connectors/feiqiu/api/rate_limiter.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""请求间隔控制器,支持取消信号中断等待。"""
|
||||
|
||||
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
|
||||
Reference in New Issue
Block a user