есть ли способ ограничить количество вызовов функции за одну секунду, используя ruby? - PullRequest
0 голосов
/ 07 мая 2020

У меня медленный запрос sql, и я хотел бы ограничить количество вызовов функции за одну секунду до (3).

Допустим, у меня есть эти вызовы, я Я бы хотел, чтобы функция делала это:

call_func() -> true
call_func() -> true
call_func() -> true
call_func() -> false
sleep(1)
call_func() -> true

Я установил ограничение до 3 вызовов в секунду, а затем таймер сбрасывается. Как бы вы сделали это в ruby, используя Process.clock_gettime(Process::CLOCK_MONOTOMIC)

1 Ответ

0 голосов
/ 07 мая 2020

https://msp-greg.github.io/eventmachine/EventMachine/PeriodicTimer.html

Ваш код будет выглядеть примерно так:

n = 0
timer = EventMachine::PeriodicTimer.new(1) do
    call_func()
    timer.cancel if (n+=1) > 3
end

Хотя по правде говоря, я думаю, что накладные расходы на это сами по себе съедят некоторые из 1 секунда, которую вы выделяете для запроса SQL, поэтому вы можете столкнуться с ситуацией, когда запрос выполняется только 1 или 2 раза в течение секунды, выделенной таймеру, и я не мог начать прогнозировать увеличение ресурсов (память и др. c.), что добавление этого создаст.

Возможно, вам будет лучше просто использовать потоки для решения проблемы. Вы просто создаете поток для каждого запроса, и всякий раз, когда он завершается, он завершается. Затем вы можете ограничить пул потоков для управления нагрузкой.

https://rossta.net/blog/a-ruby-antihero-thread-pool.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...