我有一个方法'rate_limited_follow',它接受我的Twitter useraccount并跟踪数组'users'中的所有用户。 Twitter有严格的速率限制,因此该方法通过睡眠15分钟然后再次重试处理该意外事件。 (我没有写这个方法,而是从Twitter ruby gem api获得它)。您会注意到它会检查尝试次数是否小于MAX_ATTEMPTS。
我的用户阵列有大约400个用户,我正在尝试关注。它一次增加15个用户(当速率限制似乎开始时),然后睡15分钟。由于我将MAX_ATTEMPTS常量设置为3(只是为了测试它),我预计一旦它添加了45个用户(3次15)就停止尝试但是它已经过去了,每15分钟就会继续添加15个用户,所以它似乎num_attempts以某种方式保持在3以下,即使它经历了这个循环超过3次。有什么我不明白的代码吗?一旦“睡眠”完成并且它“重试”,它又会从哪里开始?有没有理由num_attempts没有递增?
在循环中调用方法
>> users.each do |i|
?> rate_limited_follow(myuseraccount, i)
>> end
使用常量
的方法定义MAX_ATTEMPTS = 3
def rate_limited_follow (account, user)
num_attempts = 0
begin
num_attempts += 1
account.twitter.follow(user)
rescue Twitter::Error::TooManyRequests => error
if num_attempts <= MAX_ATTEMPTS
sleep(15*60) # minutes * 60 seconds
retry
else
raise
end
end
end
答案 0 :(得分:0)
对rate_limited_follow的每次调用都会重置您的尝试次数 - 或者,重新定义,您将跟踪每个用户的尝试,而不是尝试整个用户群。
将num_attempt的初始化从rate_limited_follow中提取出来,这样每次调用都不会重置它,并且您将拥有您正在寻找的行为。