2

我需要限制我的 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 请求,或者我是否符合上述想法?我正在使用红宝石 1.9.3。

4

2 回答 2

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 秒已经过去,但是如果响应时间比这更长,则计时器已经过期,下一个请求可以立即开始。

于 2013-09-09T16:33:44.953 回答
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 调用超过一分钟,代码将立即循环。

于 2013-09-09T16:42:28.483 回答