2010-08-12 41 views
0

我正在實現一個輪詢服務,其界面如下所示。需要一個ruby解決方案來執行一個方法在單獨的過程

poller = Poller.new(SomeClass) 
poller.start 
poller.stop 

start方法應該是開始連續命中數據庫中的http請求和更新的東西。一旦編號start,該過程應該繼續,直到明確stop編輯。

我知道start的實現需要產生並在一個新的過程中運行。我不太確定如何在Ruby中實現這一點。我想要一個ruby解決方案,而不是一個ruby框架特定的解決方案(不包括rails插件或sinatra擴展,只是ruby的寶石)。我正在探索事件機器和八哥工。我發現eventmachine太短而難以理解,而workling是一個插件而不是寶石。所以,讓它爲Ruby應用程序工作是一種痛苦。

我需要指導我如何做到這一點。任何指針?代碼示例將有所幫助。

編輯

EventMachine的或八哥-workling溶液將是優選的過穿線/分叉。

+0

你需要一個單獨的進程或只是一個單獨的線程? – jtbandes 2010-08-12 05:17:52

+0

只要我能夠運行上面給出的輪詢器,它並不重要。 – Chirantan 2010-08-12 05:24:05

回答

0
class Poller 

    def start 
     @thread = Thread.new { 
      #Your code here 
     } 
    end 


    def stop 
     @thread.stop 
    end 

end 
2

你不能使用來自Process#kill的例子:

class Poller 
    def initialize klass 
    @klass = klass 
    end 

    def start 
    @pid = fork do 
     Signal.trap("HUP") { puts "Ouch!"; exit } 
     instance = @klass.new 
     # ... do some work ... 
    end 
    end 

    def stop 
    Process.kill("HUP", @pid) 
    Process.wait 
    end 
end 
+0

有幾個問題。 1)代碼'Process.wait'的目的是什麼? 2)在紅寶石中分叉是安全的。詢問是因爲我讀過/聽過/瞭解到紅寶石中的進程和線程並不可靠。你能否證明你的解決方案合理? – Chirantan 2010-08-12 05:44:26

+0

1)我猜一旦你調用'kill',子進程沒有終止,有一個'trap'調用應該在子進程中進行清理,這可能需要一些時間。 「等待」在那裏等待退出。 2)定義_safe_。分叉與任何其他語言一樣,它是OS的特徵,而不是語言。 – 2010-08-12 05:57:08

+0

+1您的解決方案現在已經工作。 – Chirantan 2010-08-12 06:39:51

相關問題