2012-10-30 113 views
4

我正在嘗試使用Ruby的daemon gem並循環重新啓動具有自己的循環的守護進程。我的代碼看起來像現在這樣:如何循環重啓守護進程?

require 'daemons' 

while true 
    listener = Daemons.call(:force => true) do 
    users = accounts.get_updated_user_list 

    TweetStream::Client.new.follow(users) do |status| 
     puts "#{status.text}" 
    end 
    end 
    sleep(60) 
    listener.restart 
end 

運行這給了我下面的錯誤(60秒後):

undefined method `restart' for #<Daemons::Application:0x007fc5b29f5658> (NoMethodError) 

所以很明顯Daemons.call不返回一個可控的守護像我想它。我需要做什麼才能正確設置它。守護進程是否是正確的工具?

+0

你的意圖究竟是什麼?我無法分辨你想做什麼,但我可以猜測你走錯了路。 爲什麼你想每60秒重新啓動守護進程? – Fitzsimmons

+0

我正在使用Tweetstream gem從用戶列表中獲取Tweets。每分鐘(或10分鐘或其他),我想重新生成該用戶列表,然後重新啓動Tweetstream客戶端。我將更新示例代碼以更好地反映這一點。 – DorkRawk

回答

3

我認爲這是你之後,雖然我沒有測試過它。

class RestartingUserTracker 
    def initialize 
    @client = TweetStream::Client.new 
    end 

    def handle_status(status) 
    # do whatever it is you're going to do with the status 
    end 

    def fetch_users 
    accounts.get_updated_user_list 
    end 

    def restart 
    @client.stop_stream 
    users = fetch_users 
    @client.follow(users) do |status| 
     handle_status(status) 
    end 
    end 
end 

EM.run do 
    client = RestartingUserTracker.new 
    client.restart 

    EM::PeriodicTimer.new(60) do 
    client.restart 
    end 
end 

下面是它如何工作的:

TweetStream使用EventMachine的內部,作爲輪詢的方式API永遠和處理響應。我可以看到爲什麼你可能感覺卡住了,因爲通常的TweetStream API會永遠阻止,並且無法讓你在任何時候進行干預。但是,TweetStream確實允許您在同一事件循環中設置其他內容。在你的情況下,一個計時器。我在這裏找到了關於如何做到的文檔:https://github.com/intridea/tweetstream#removal-of-on_interval-callback

通過啓動我們自己的EventMachine reactor,我們能夠將自己的代碼注入反應堆並使用TweetStream。在這種情況下,我們使用一個簡單的計時器,每60秒重新啓動客戶端。

EventMachine是一個叫做反應堆模式的實現。如果你想完全理解和維護這些代碼,它可以幫助你找到關於它的一些資源並獲得充分的理解。反應堆模式非常強大,但起初可能難以掌握。

但是,這段代碼應該讓你開始。另外,我會考慮將RestartingUserTracker重命名爲更適合的東西。

+0

這看起來非常好!看起來我應該更多地瞭解EventMachine。我會明天測試這個,然後結束這個問題。謝謝! – DorkRawk