我有一个项目需要在循环和后台运行方法。
基本上我有一个方法:调用Web服务→读取数据→存储到数据库中→一遍又一遍地循环。
我发现了一个名为“loops”的宝石,但可能有两个问题:
我不知道他们是否支持 Rails 3 & Ruby 1.9.3 和
似乎没有任何支持(上次提交是半年前)。
我有一个项目需要在循环和后台运行方法。
基本上我有一个方法:调用Web服务→读取数据→存储到数据库中→一遍又一遍地循环。
我发现了一个名为“loops”的宝石,但可能有两个问题:
我不知道他们是否支持 Rails 3 & Ruby 1.9.3 和
似乎没有任何支持(上次提交是半年前)。
Ruby 有一个循环结构。
loop { puts "hi" }
您可以从 rake 任务调用该方法,然后从命令行使用nohup
.
例子:
在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
.
开发一个简单的循环程序,例如:
loop do
data = read_data_from_web_service
store_data_to_db(data)
end
中配置脚本upstart
。您可以foreman
为此使用 gem。foreman
否则,您可以upstart
根据自己的方便直接使用。检查链接
或者你可以使用一些工具monit
来监控脚本。
如果我理解正确,您的目标是让代码在后台无休止地循环。
以下是您需要的部分:
loop do <code> end
将在当前线程中不间断地循环<code>
mythread = Thread.new(<args>) do |<args>| <code> end
mythread.run
将在另一个线程(后台,也称为异步)中运行 <code> 并将 <args> 传递给它,就好像它是一个函数一样。
你想要做的是在一个线程内循环 <code> 。所以......(假设你想通过
myloop = lambda do loop do <code> end end
mythread = Thread.new(myloop) do |loop| loop.call end
mythread.run
您可以使用每当宝石。通过这个宝石很容易做这种工作。
甚至还有关于这个主题的免费railscast 。
创建一个 rake 任务,调用您的方法进行循环。(请参阅其他答案如何做到这一点)。
然后你可以创建一个时间表,上面写着,every 1.minute
就像这样。