Créer un bot de support IA pour votre boutique en ligne

Bot de support en Python : code source

Fichiers : 2988,4 KiBTélécharger le ZIP

store_assistant/ratelimit.py

1,4 KiBBrutTélécharger
Python
1"""Per-user sliding-window rate limiter."""23from __future__ import annotations45import threading6import time7from collections import deque8from collections.abc import Callable91011class RateLimiter:12    """Allows at most `limit` events per `window_s` seconds for each key."""1314    def __init__(self, limit: int, window_s: float = 60.0, clock: Callable[[], float] = time.monotonic) -> None:15        if limit < 1:16            raise ValueError("limit must be at least 1")17        self._limit = limit18        self._window = window_s19        self._clock = clock20        self._events: dict[int, deque[float]] = {}21        self._lock = threading.Lock()2223    def check(self, key: int) -> float:24        """Record an event and return 0, or return the seconds to wait if the key is over the limit."""25        now = self._clock()26        with self._lock:27            events = self._events.setdefault(key, deque())28            while events and now - events[0] >= self._window:29                events.popleft()30            if len(events) >= self._limit:31                return max(0.0, self._window - (now - events[0]))32            events.append(now)33            self._prune(now)34            return 0.03536    def _prune(self, now: float) -> None:37        if len(self._events) < 5_000:38            return39        for key in [k for k, ev in self._events.items() if not ev or now - ev[-1] >= self._window]:40            del self._events[key]