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