【问题标题】:How to run non blocking command from Ruby?如何从 Ruby 运行非阻塞命令?
【发布时间】:2012-04-04 15:33:09
【问题描述】:
  • 用户转到页面 A 以创建新的多人游戏
  • 页面 A 中的脚本为游戏生成一个唯一 ID,并为其创建一个工作器。类似于:rails runner GameWorker.new(:game_id => game_id).start_game
  • 页面 A 中的脚本将用户重定向到页面 B,在那里他可以看到新创建的游戏,其他人也可以加入。

工人应该活着直到游戏结束。

运行启动worker的命令的正确方法是什么?它必须是非阻塞的,并且最好将输出重定向到日志文件,以防出现问题。

如果重要的话,我正在使用 Rails 3。

更新 我要改写我的问题:如何从 ruby​​ 中运行 linux 命令并且不等待命令结束?我的意思是 &>> 的等价物。例如,在 php 中,&>> 工作正常,我不需要使用任何特殊的 php 函数,但在 ruby​​ 中,它似乎被覆盖,脚本等待命令结束并获取输出。

【问题讨论】:

  • 你为什么要为此使用跑步者?你当时的想法是什么?
  • @JesseWolgamott 我使用 runner 来创建和运行工人。它就像一个 cronjob:它不是请求/响应的一部分,它有自己的“生命”
  • 听起来你需要一个订阅/发布服务,就像工作人员一样。也就是说,如果您想与多个用户实时通信。签出:faye.jcoglan.com
  • 我使用 gem 'daemons',它每秒都在寻找处理所需的游戏
  • 我的回答可能对您有所帮助。不要注意它使用 Sinatra 的事实,只是启动进程并存储其 PID 的操作。 stackoverflow.com/a/9911695/366051

标签: ruby-on-rails ruby


【解决方案1】:

我强烈建议不要在每个游戏中运行一个进程。如果你想要一个非回合制的非阻塞游戏,那么你可能想看看 event-machine,或者类似https://github.com/celluloid/celluloid-io

无论使用哪种方式,您都将创建在未来时间点处理的线程。

但是——如果你确实想在 ruby​​ 中启动一个进程,那么你就去吧……来自How to fire and forget a subprocess?

pid = Process.fork
if pid.nil? then
  # In child
  exec "whatever --take-very-long"
else
  # In parent
  Process.detach(pid)
end

【讨论】:

猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2013-06-23
  • 2021-06-14
  • 2015-08-13
相关资源
最近更新 更多