每个rails服务器重启时只运行一次的代码

时间:2013-03-31 20:13:06

标签: ruby-on-rails multithreading

我的申请是2倍。首先,它运行一个线程,读取Arduino输出以获取数据并将它们存储在我的模型中。它永远这样做,因为Arduino永远感知数据。其次,主Web应用程序分析数据并绘制精美的图形。

当我启动rails服务器时,我希望读取线程只运行一次。

我当前的实现是在我的应用程序的主控制器中有一个线程(因为我需要模型来存储数据)。每次刷新页面时,都会创建一个新线程。这不是我想要的,因为并发访问Arduino会产生错误的读数。

我想这是一个相当经典的问题,但我不知道用Rails获取该行为的方式是什么。我一直在寻找和谷歌搜索一个星期,但我仍然卡住了。

提前致谢。 皮尔

2 个答案:

答案 0 :(得分:1)

工作错误的工具。的种类。你不会希望rails应用程序监视Arduino输出,rails并不是真的有类似的东西。您最好有一个单独的专用应用程序读取Arduino输出,然后将信息保存到数据库。

Arduino输出--->应用解析输出---> DB ---> Rails App

通过这种方式,您的Web应用程序可以专注于Web,而不会在作业之间徘徊。

执行此操作的一个有趣方法是将解析应用程序设置为ruby应用程序,并在此实例中使用rails之外的Active Record。虽然我从未这样做过,但人们在纯Ruby应用程序中使用了Active Record in simliar setup。这是一个古老的例子。

http://blog.aizatto.com/2007/05/21/activerecord-without-rails/

这样,当您重新部署rails应用程序时,仍然可以收集数据。它还会创建一个防火墙,因此如果您的rails应用程序爆炸或发生故障,数据收集将不会受到影响。

答案 1 :(得分:1)

同意@rovermicrover,您应该考虑将与arduino交互的任务从Web应用程序中分离出来。

为此,我建议您为该作品创建一个rake任务。然后,您可以考虑通过foreman管理该rake任务的启动/停止/重启。这是一个很好的干净方式,你也可以很容易地进行capistrano集成。