Как создать метод, который обращается к API с интервалом в одну секунду?

#ruby-on-rails #ruby #ruby-on-rails-3 #heroku

#ruby-on-rails #ruby #ruby-on-rails-3 #heroku

Вопрос:

Я создаю библиотеку, которую я буду запускать delayed_job в качестве фоновой службы на heroku.

Смысл метода lib будет заключаться в том, чтобы обращаться к API для обработки большого количества данных. API, к которому я обращаюсь, имеет ограничение в 600 запросов Graph API за 600 секунд.

При этом я хотел бы знать, можно ли было бы убедиться, что моя отложенная работа не будет проходить через это.

Что-то вроде:

 requests_made = 0
@items.each do |x|

    if request_made >= 600
        pause for 1 second??????? Is this possible?
    end

    ### HIT THE API
    requests_made = requests_made   1
end
  

Возможно ли что-то подобное? Возможна ли приостановка? Отложенные задания Heroku будут выполняться до 4 часов, поэтому я не вижу проблемы с тайм-аутом. Мысли?

Ответ №1:

sleep(1) вероятно, это самый явный и простой метод. Будет ли использование этого проблемой?

Добавлено в ответ на комментарий

Чтобы измерить время, затраченное на вызов API, выполните

 start_time = Time.now
call_the_API
spent_time = Time.now - start_time
  

Затем вы можете выполнить некоторые условные обозначения на spent_time .

Комментарии:

1. Я так не думаю? Я никогда раньше не использовал sleep

2. Есть какие-либо способы рассчитать время, поэтому определите, сколько времени требуется для выполнения вызова API, а затем вычтите это из 1… И если значение равно , то sleep?

3. @AnApprentice Я добавил, как измерить время, затраченное на API.

4. @AnApprentice, как только у вас это получится spent_time , посмотрите, так ли это > 1 . Если это так, то немедленно продолжайте, а не переходите в спящий режим. Кроме того, sleep() принимает дробные значения, поэтому, если spent_time < 1 вы можете sleep(1.0 - spent_time) , сделайте паузу в коде менее секунды, что поможет вам не сбиться с пути. Если это не так важно, вы можете просто sleep(1) всегда и вы сделаете чуть меньше 600.