Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3与后台进程之间的I/O_Ruby On Rails_Ruby_Io - Fatal编程技术网

Ruby on rails Rails 3与后台进程之间的I/O

Ruby on rails Rails 3与后台进程之间的I/O,ruby-on-rails,ruby,io,Ruby On Rails,Ruby,Io,简短版本:我需要从Rails控制器(使用Rails 3)启动子流程(Ruby脚本),并将子流程中的stdout消息呈现到网页,并从Rails视图将信息传递到子流程中 设置:我有一个Ruby脚本,它与一个名为Ruby 1.9.3的软件消息总线系统进行通信,使用Ruby 1.9.3向网络上其他地方运行的某些硬件发送控制消息,并从中接收消息。我不能在这里使用替代的信息系统,它必须是常春藤。脚本当前将消息写入stdout 问题1:我想从Rails应用程序的控制器以子进程(或线程,我愿意接受建议)的形式启

简短版本:我需要从Rails控制器(使用Rails 3)启动子流程(Ruby脚本),并将子流程中的
stdout
消息呈现到网页,并从Rails视图将信息传递到子流程中

设置:我有一个Ruby脚本,它与一个名为Ruby 1.9.3的软件消息总线系统进行通信,使用Ruby 1.9.3向网络上其他地方运行的某些硬件发送控制消息,并从中接收消息。我不能在这里使用替代的信息系统,它必须是常春藤。脚本当前将消息写入
stdout

问题1:我想从Rails应用程序的控制器以子进程(或线程,我愿意接受建议)的形式启动此脚本。我希望能够接收来自此脚本的消息,以便它们可以显示在网页上。不需要将这些消息持久地存储在数据库中,因此我考虑使用Rails缓存来临时存储和访问这些消息,并可能使用AJAX每隔一段时间轮询缓存中的新消息。这可能吗

问题2:相同的Rails应用程序需要能够将控制消息从网页(例如,通过用户与按钮、下拉列表或其他一些UI元素交互)发送到Ivy子流程,以便这些控制消息可以传播到硬件

我已经研究了潜在的解决方案,如,和其他,但我无法通过浏览文档找到确凿的证据,证明这些潜在的解决方案可以同时解决问题1和2。因此,我的问题如下:

  • 像Sidekiq或DelayedJob这样的现成解决方案可以处理此任务吗
  • Rails中是否已经有某种内置方法可以实现这一点
  • 这个问题接近于观点,但我还是要问。我有其他追求Rails的理由,但如果这项任务非常困难,它们可能会被击败。使用Rails做这样的事情是不是很痛苦,以至于我应该寻找其他解决方案
  • Rails(大部分)很好

    Sidekiq或Resque是进行常春藤民意调查的好方法。您可以安排工作进程定期轮询新邮件

    虽然Rails 4提供实时流媒体,但它还没有准备好进入黄金时间。我建议使用Node.js/Socket.io之类的设置通过WebSocket与客户端浏览器进行对话。或者,如果不需要花哨的实时更新,而且客户端数量很少,只需让工作人员将结果转储到数据库中,并让浏览器轮询更新即可

    但是,常春藤是个棘手的问题。我没有看到太多关于通过Ruby/Rails应用程序与Ivy交谈的内容。也许您可以使用JRUby,然后使用一个Java包装器


    由于您不是Rails的超级用户,因此使用Python或Perl可能更容易做到这一点,因为常春藤人已经有了用这些语言编写的工具。

    听起来有三个问题:

  • 监视ivybus中的消息
  • 通过ivybus发送命令
  • 用户交互(web界面)
  • Rails框架只是解决了第3个问题。这就是它设计的全部目的。然而,这并不意味着Ruby/Rails不是这项工作的好工具。以下是我对设置此功能的一些想法:

    问题1肯定会发生在某种背景工作中。它不应该是标准web请求的一部分。我认为关注点2在背景工作中也更有效。任何容易出错或可能长时间运行的任务都应该尽可能远离web请求

    有几种方法可以将这些任务放到后台。Sidekiq是关注点2(发送命令)的完美解决方案。控制器将收到来自用户的执行某些操作的请求,并且控制器将作业提交给后台工作人员来执行该操作。Sidekiq还可以解决问题1(监控),但您必须创建定期作业(如轮询)以继续检查接口是否有新消息。Sidekiq并不意味着运行无限期运行的作业

    解决问题1最可靠的方法是创建一个守护进程。这似乎有些过分,但像“守护进程”这样的宝石使这项任务变得相当简单。这个守护进程可以监视接口并将您关心的数据推送到某种数据存储中(MySQL、Redis等)


    您可以使用这些背景解决方案中的一个或两个来解决这个问题,但我肯定认为您需要一个单独的过程来管理至少第一个问题。这将允许关注点3(您的web应用程序)只处理从数据存储中读取数据并为用户呈现数据,以及将某些请求(命令)转换为后台作业。这可以让你的Rails应用程序尽其所能,但仍然可以让你做你需要的一切。

    Rails 4支持实时流媒体()