2011-11-12 53 views
1

我有一個名爲'worker.rb'的腳本。當運行這個腳本將執行處理一段時間(一小時可以說),然後死亡。Ruby如何創建將產生多個工作者的守護進程

我需要另一個腳本來負責產生上面的工作者腳本。我們稱這個腳本爲'runner.rb'。 'runner.rb'將被調用,並指示允許產生多少工人。

我想runner.rb做到以下幾點:(例如,「紅寶石runner.rb 5」) - 查詢特定值的數據庫(例如有100個值) - 「worker.rb的菌種5個實例'(分別傳遞前5個值) - 繼續檢查上面產生的'worker.rb'的任何實例,然後使用數據庫中的第6個值再次調用'worker.rb',並無限期地繼續此過程。

我正在使用守護進程的寶石,但我失去了作爲這個最好的方式去。 '跑步者'腳本應該一定是守護神 - 但是工作者是否也應該被守護?

'跑步者'應該如何檢查「工人」是否已完成?這可以使用存儲在文件中的PID來完成嗎?

+0

你在heroku上做這個嗎? – Sean

回答

0

我之前使用過守護進攻寶石。但不知何故,在保持子進程的數量方面做得不好。然後我又做了一個,叫light_daemon。你可以讓light_daemon預先指定一定數量的工作進程。如果其中一名工作人員因任何原因死亡,light_daemon將產生一個新的代替它。如果您的工作進程可能導致內存泄漏問題,那麼您可以讓工作在太大之前積極死亡。父進程將保持工作進程的數量不變。我在我的一個項目的生產現場使用它。我工作得很好。

以下是使用light-daemon寶石的示例守護進程。

require 'rubygems' 
require 'light_daemon' 

class Client 
    def initialize 
    @count = 0 
    end 

    def call 
    `echo "process: #{Process.pid}" >> /tmp/light-daemon.txt` 
    sleep 3 
    @count +=1 
    (@count < 100)? true : false 
    end 
end 

LightDaemon::Daemon.start(Client.new, :children=> 2, :pid_file => "/tmp/light-daemon.pid") 

在守護進程中,工作進程在方法「調用」被調用100次後死亡。然後產生一個新的工作流程,並繼續進行。

相關問題