#algorithm #data-structures #throttling
#алгоритм #структуры данных #регулирование
Вопрос:
У меня есть интерфейс запроса, который вызывается много раз в секунду и выглядит примерно так:
def do_something(timestamp_in_ms)
Я ищу способ выполнить простое регулирование запросов, которое гарантирует, что обрабатываются только первые N запросов за секунду, а остальные отбрасываются. В идеале это должно выполняться для каждого временного интервала, который длится секунду (например 00:00:00.123-00:00:01.123) вместо того, чтобы использовать только тактовые секунды (например, 00:00:00-00:00:01).
Дополнительная проблема заключается в том, что do_something
это вызывается чрезвычайно часто, поэтому регулирование должно быть эффективным.
Ответ №1:
Вы могли бы использовать очередь, которая содержит временные метки предыдущих N-1 запросов и сравнивает временную метку нового запроса-кандидата с временной меткой самого раннего запроса в очереди.
- если разница составляет более одной секунды, запрос-кандидат выполняется, а его временная метка добавляется в очередь;
- если разница составляет менее одной секунды, запрос-кандидат отбрасывается.
Всякий раз, когда в очередь добавляется новая временная метка, самая старая временная метка выбрасывается.
Ресурсы:
Комментарии:
1. Я бы предположил, что концептуально очередь здесь должна быть реализована как кольцевой буфер?
2. @ZizhengTai Я не думаю, что это действительно имеет значение. Вы можете использовать любую реализацию очереди. Если вам нравятся кольцевые буферы, вы можете использовать кольцевой буфер. В Python уже есть классы
queue.Queue
, иqueue.SimpleQueue
поэтому я предлагаю использовать один из них, если вы специально не хотите получить возможность обучения для реализации своих собственных.