2012-11-03 157 views
0

我有一個需要在循環和後臺運行方法的項目。在循環中運行方法

基本上我有一個方法:調用Web服務 - >讀取數據 - >存儲到數據庫 - >循環一遍又一遍。

我發現了一個叫做「loops」的gem(https://github.com/kovyrin/loops),但也許有2個問題:a)我不知道他們是否支持Rails 3 & Ruby 1.9.3和2)似乎沒有支持(最後一次提交是半年前)。

對此提出建議?他們都非常受歡迎。

非常感謝,夥計們!

+0

你有什麼試過?這看起來很簡單,創建一個線程,它將在循環中運行該方法並啓動線程。 – 2012-11-03 03:37:06

+0

我沒有嘗試過任何東西。按照你發佈的方式,我應該在app init中啓動線程,對吧? –

回答

0

開發是一個簡單的循環程序:

loop do 
    data = read_data_from_web_service 
    store_data_to_db(data) 
end 

配置upstart腳本。您可以使用foreman寶石。 否則,根據您的方便,您可以只使用foreman而不使用upstart。 檢查link

或者您可以使用一些工具如monit來監視腳本。

1

Ruby有一個循環結構。

loop { puts "hi" }

+1

他想在後臺運行它,因此我提到了線程 – 2012-11-03 03:48:28

0

你可以稱之爲從rake任務的方法,然後在命令行中與nohup啓動rake任務。

例子:

lib/tasks/fetch_data.rake

task :fetch_and_save => :environment do 
    loop do 
    Model.method() # Do whatever you need to do here 
    end 
end 

然後,您可以用$ nohup rake fetch_and_save啓動它。

+0

看起來不錯。我會盡快嘗試併發布結果。順便說一句,謝謝! –

+0

你也可以使用像[god](https://github.com/mojombo/god)這樣的進程監視器來保持它運行。 –

0

如果我理解正確,你的目標是讓代碼在後臺無限循環。

這裏有您需要的部分:

loop do <code> end 

將循環<碼>馬不停蹄在當前線程

mythread = Thread.new(<args>) do |<args>| <code> end 
mythread.run 

將運行<碼>在另一個線程(背景,又名異步)並且會通過<參數,就像它是一個函數一樣。

你想做什麼,就是循環<代碼>在一個線程內。所以...(假設你想傳遞

myloop = lambda do loop do <code> end end 
mythread = Thread.new(myloop) do |loop| loop.call end 
mythread.run 
0

可以使用Whenever寶石。這很容易做這樣的工作,通過這個寶石。

甚至還有一個免費railscast關於這一主題。

創建一個調用您的方法循環的rake任務。 (見其他答案如何做到這一點)。

然後你可以創建一個時間表,every 1.minute像這樣。