Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: rate, limit, decorator

Как реализовать подсчёт количества вызовов функции с автоматическим сбросом счётчика по времени без использования Redis?

Вопрос проверяет умение реализовать простое временное счётчик-поведение (rate-like логику) средствами языка и стандартной библиотеки, без внешних хранилищ.

Короткий ответ

Подсчёт количества вызовов функции с автоматическим сбросом по времени можно реализовать в памяти процесса, используя время последнего сброса и текущий счётчик. При каждом вызове мы проверяем, не прошло ли заданное количество секунд: если прошло — обнуляем счётчик и обновляем "временную метку", затем увеличиваем счётчик. Для этого подойдут time.time() или datetime, а хранить данные можно в замыкании, глобальной структуре или внутри класса-декоратора. Такой подход работает в рамках одного процесса/инстанса и не требует Redis или других внешних систем.

Длинный ответ

Подсчёт вызовов функции с ограничением по времени (например, "не более N вызовов в X секунд") часто используется для rate limiting, простого мониторинга или логики защиты от злоупотреблений. Если нет Redis или другого общего хранилища, можно решить задачу на уровне одного процесса.

Идея реализации

Нужно хранить:

  • текущее значение счётчика;

  • время последнего сброса;

  • интервал, через который счётчик нужно сбросить.

Алгоритм при каждом вызове функции:

  1. Берём текущее время (now).

  2. Сравниваем его с временем последнего сброса (last_reset).

  3. Если now - last_reset >= interval, обнуляем счётчик и last_reset = now.

  4. Увеличиваем счётчик и выполняем функцию.

Такое поведение удобно оформить через декоратор.


Пример простого декоратора

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).

Важно понимать ограничения:

  • решение работает только в одном процессе;

  • при нескольких инстансах приложения счётчики будут независимыми;

  • при рестарте процесса счётчики обнулятся.


Вывод

Подсчёт вызовов функции с авто-сбросом можно реализовать локально, используя время и счётчик в памяти процесса. Это дешёвое и простое решение для однопроцессных или небольших систем, когда не нужен общий глобальный лимит между разными инстансами.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Python

    Python

Ключевые слова

#rate

#limit

#decorator

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.