0

Twitter のユーザー アカウントを取得し、配列「users」内のすべてのユーザーをフォローする「rate_limited_follow」メソッドがあります。Twitter には厳格なレート制限があるため、この方法では 15 分間スリープしてから再試行することで不測の事態に対処しています。(このメソッドは私が書いたのではなく、Twitter の ruby​​ gem api から取得したものです)。試行回数が MAX_ATTEMPTS よりも少ないかどうかをチェックすることに気付くでしょう。

私の users 配列には、フォローしようとしている約 400 人のユーザーがいます。一度に 15 人のユーザーを追加し (レート制限が開始されたように見えるとき)、15 分間スリープします。MAX_ATTEMPTS 定数を 3 に設定したので (テストのため)、45 ユーザー (3 かける 15) が追加されたら試行を停止すると予想していましたが、それを超えて、15 分ごとに約 15 ユーザーを追加し続けているため、このサイクルを 3 回以上行ったにもかかわらず、num_attempts が何らかの形で 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 を呼び出すたびに、試行回数がリセットされます。言い換えると、ユーザーの配列全体ではなく、ユーザーごとの試行を追跡しています。

num_attempt の初期化を rate_limited_follow から引き上げて、呼び出しごとにリセットされないようにすると、探している動作が得られます。

于 2012-10-14T08:20:32.617 に答える