【问题标题】:Ruby: begin, sleep, retry: where to put incrementerRuby:开始,睡眠,重试:将增量器放在哪里
【发布时间】:2012-10-04 12:06:17
【问题描述】:

我有一个方法“rate_limited_follow”,它获取我的 Twitter 用户帐户并关注数组“用户”中的所有用户。 Twitter 有严格的速率限制,因此该方法通过休眠 15 分钟然后重试来处理这种意外情况。 (我没有写这个方法,而是从 Twitter ruby​​ gem api 得到的)。您会注意到它会检查尝试次数是否小于 MAX_ATTEMPTS。

我的 users 数组有大约 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

【问题讨论】:

  • 而不是写15*60和cmets。你可以写15.minutes

标签: ruby twitter


【解决方案1】:

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

Hoist num_attempt 的初始化超出 rate_limited_follow,因此它不会被每次调用重置,并且您将获得您正在寻找的行为。

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多