2012-11-03 108 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像这样。