22 lines
618 B
Python
22 lines
618 B
Python
import time
|
|
from collections import deque
|
|
from typing import Callable
|
|
|
|
WINDOW_SECONDS = 60
|
|
|
|
|
|
class SlidingWindowLimiter:
|
|
def __init__(self, clock: Callable[[], float] = time.time, window: float = WINDOW_SECONDS):
|
|
self._clock = clock
|
|
self._window = window
|
|
self._stamps: deque[float] = deque()
|
|
|
|
def try_acquire(self, limit: int) -> bool:
|
|
now = self._clock()
|
|
while self._stamps and now - self._stamps[0] >= self._window:
|
|
self._stamps.popleft()
|
|
if len(self._stamps) >= limit:
|
|
return False
|
|
self._stamps.append(now)
|
|
return True
|