0

我有一个方法“rate_limited_follow”,它使用我的 Twitter 用户帐户并关注数组“用户”中的所有用户。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
4

1 回答 1

0

每次调用 rate_limited_follow 都会重置您的尝试次数 - 或者,换句话说,您正在跟踪每个用户的尝试次数,而不是整个用户数组的尝试次数。

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

于 2012-10-14T08:20:32.617 回答