Ruby:开始,睡眠,重试:放置增量器的位置

时间:2012-10-14 06:53:26

标签: ruby twitter

我有一个方法'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

1 个答案:

答案 0 :(得分:0)

对rate_limited_follow的每次调用都会重置您的尝试次数 - 或者,重新定义,您将跟踪每个用户的尝试,而不是尝试整个用户群。

将num_attempt的初始化从rate_limited_follow中提取出来,这样每次调用都不会重置它,并且您将拥有您正在寻找的行为。