Вопрос проверяет умение реализовать простое временное счётчик-поведение (rate-like логику) средствами языка и стандартной библиотеки, без внешних хранилищ.
Подсчёт количества вызовов функции с автоматическим сбросом по времени можно реализовать в памяти процесса, используя время последнего сброса и текущий счётчик. При каждом вызове мы проверяем, не прошло ли заданное количество секунд: если прошло — обнуляем счётчик и обновляем "временную метку", затем увеличиваем счётчик. Для этого подойдут time.time() или datetime, а хранить данные можно в замыкании, глобальной структуре или внутри класса-декоратора. Такой подход работает в рамках одного процесса/инстанса и не требует Redis или других внешних систем.
Подсчёт вызовов функции с ограничением по времени (например, "не более N вызовов в X секунд") часто используется для rate limiting, простого мониторинга или логики защиты от злоупотреблений. Если нет Redis или другого общего хранилища, можно решить задачу на уровне одного процесса.
Нужно хранить:
текущее значение счётчика;
время последнего сброса;
интервал, через который счётчик нужно сбросить.
Алгоритм при каждом вызове функции:
Берём текущее время (now).
Сравниваем его с временем последнего сброса (last_reset).
Если now - last_reset >= interval, обнуляем счётчик и last_reset = now.
Увеличиваем счётчик и выполняем функцию.
Такое поведение удобно оформить через декоратор.
python
import time
from functools import wraps
def count_calls_with_reset(interval_seconds=60):
calls = 0
last_reset = time.time()
def decorator(func):
nonlocal calls, last_reset
@wraps(func)
def wrapper(*args, **kwargs):
nonlocal calls, last_reset
now = time.time()
if now - last_reset >= interval_seconds:
calls = 0
last_reset = now
calls += 1
# здесь можно логировать значение calls
return func(*args, **kwargs)
return wrapper
return decorator
Такой декоратор:
хранит счётчик и время сброса в замыкании;
автоматически обнуляет счётчик каждые interval_seconds.
добавить лимит и бросать исключение, если вызовов стало слишком много;
использовать класс вместо замыкания для большей гибкости;
хранить счётчики по ключам (например, по user_id или по IP).
Важно понимать ограничения:
решение работает только в одном процессе;
при нескольких инстансах приложения счётчики будут независимыми;
при рестарте процесса счётчики обнулятся.
Подсчёт вызовов функции с авто-сбросом можно реализовать локально, используя время и счётчик в памяти процесса. Это дешёвое и простое решение для однопроцессных или небольших систем, когда не нужен общий глобальный лимит между разными инстансами.