我需要限制我的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。
答案 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调用花了一分多钟,代码将立即循环。