2015-04-12 63 views
0

我構建了一個網站爬蟲(稍後)使用這些鏈接來讀取信息。在Rails中使用帶有正在運行的動態計數器的sidekiq

當前的rake-task逐個遍歷所有可能的頁面,並檢查請求是否通過低谷(有效響應)或返回404/503錯誤(無效頁面)。如果它是有效的網頁url被保存到我的數據庫。 現在,您可以看到總共50,000頁的任務請求需要一些時間。

我已閱讀關於Sidekiq以及它如何可以異步執行這些任務,從而使這個更快。

我的問題:正如你可以看到我的任務在每個循環後建立計數器。我猜這不適用於Sidekiq,因爲它只會獨立執行這個獨立於腳本的腳本,對嗎?

那麼我將如何解決每個實例需要自己的計數器的問題呢?

希望我的問題有道理 - 非常感謝!

desc "Validate Pages" 
task validate_url: :environment do 
    require 'rubygems' 
    require 'open-uri' 
    require 'nokogiri' 

    counter = 1 
    base_url = "http://example.net/file" 
    until counter > 50000 do 
    begin 
     url = "#{base_url}_#{counter}/" 

     open(url) 


     page = Page.new 
     page.url = url 
     page.save! 

     puts "Saved #{url} !" 

     counter += 1 

    rescue OpenURI::HTTPError => ex 
     logger ||= Logger.new("validations.log") 
     if ex.io.status[0] == "503" 
     logger.info "#{ex} @ #{counter}" 
     end 

     puts "#{ex} @ #{counter}" 
     counter += 1 

    rescue SocketError => ex 
     logger ||= Logger.new("validations.log") 
     logger.info "#{ex} @ #{counter}" 

     puts "#{ex} @ #{counter}" 

     counter += 1 
    end 
    end 
end 

回答

1

一個簡單的Redis INCR操作將創建和/或增加一個全局計數器爲你的工作使用。你可以使用Sidekiq的redis連接實現一個簡單的計數器:

Sidekiq.redis do |conn| 
    conn.incr("my-counter") 
end 
0

如果你想使用它的異步 - 這意味着你將有許多相同的工作實例。最快的方法 - 使用類似redis的東西。這將爲您提供簡單快捷的方式來檢查\ update計數器以滿足您的需求。但也要確保你關心計數器:如果你的工作之一使用它,鎖定它的其他工作,所以不會是錯誤的結果等

相關問題