"""정중한 요청을 위한 랜덤 딜레이 레이트리미터. 기계적 등간격 요청은 탐지 신호(new.md). 요청 사이에 2~8s 랜덤 간격을 둔다. 소스(도메인)별로 인스턴스를 두고 마지막 요청 시각을 기준으로 최소 간격을 보장한다. """ import asyncio import random import time class RateLimiter: def __init__(self, min_delay: float = 2.0, max_delay: float = 8.0): self._min = min_delay self._max = max_delay self._last = 0.0 self._lock = asyncio.Lock() async def wait(self) -> None: """직전 요청으로부터 랜덤 간격이 지나도록 대기(동시 호출 직렬화).""" async with self._lock: target = random.uniform(self._min, self._max) elapsed = time.monotonic() - self._last if elapsed < target: await asyncio.sleep(target - elapsed) self._last = time.monotonic()