延迟Ruby中每个X数组项的脚本

时间:2013-09-09 13:08:43

标签: ruby api csv throttling

我需要限制我的API请求。我的脚本中有一个循环,它从csv文件中提取1000个值并循环遍历每个值,每个值都是一个单独的API调用。例如,如果我想,每分钟只进行10次API调用......我怎么能这样做?我在想这样的事情:

  csv_array.each_slice(10) do |chunk|
        chunk.each do |x|
          make_api_call(x)
          Delay.one_minute
        end
  end

是否有更好的选择来限制我的API请求,或者我是否正在按照上述想法进行操作?我使用的是ruby 1.9.3。

2 个答案:

答案 0 :(得分:0)

您可以使用线程确保在下一次调用之前已经过了正确的间隔。这个空间调用了csv数组的每个成员:

csv_array.each do |x|
  timer = Thread.new { sleep 6 }
  execution = Thread.new { make_api_call(x) }
  [timer, execution].each(&:join)
end

这样做的好处是它可以确保至少经过6秒,但如果响应时间超过了这个时间,则计时器已经过期,下一个请求可以立即开始。

答案 1 :(得分:0)

我过去曾经使用过这样的东西:

SLEEP_WINDOW = 60 * 1 # minutes
csv_array.each_slice(10) do |chunk|
  start_time = Time.now
  chunk.each do |x|
    make_api_call(x)
  end
  sleep_time = SLEEP_WINDOW - (Time.now - start_time)
  sleep sleep_time if (sleep_time > 0)
end

假设可以通过块进行爆破,然后任何剩余的延迟时间都会使代码进入睡眠状态。如果API调用花了一分多钟,代码将立即循环。