2012-10-14 17 views
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 
+0

而不是寫'15 * 60'和註釋。你可以寫'15.分鐘' – oldergod

回答

0

每次調用方法定義rate_limited_follow重置您的嘗試次數 - 或者,改變措辭,你跟蹤每個嘗試而不是嘗試通過您的整個用戶陣列。

將num_attempt的初始化從rate_limited_follow中提取出來,這樣它就不會被每次調用重置,並且您將遇到您正在查找的行爲。