如何从Ruby运行非阻塞命令?

时间:2012-04-04 15:33:10

标签: ruby-on-rails ruby

  • 用户转到第A页创建新的多人游戏
  • 页面A中的脚本为游戏生成唯一ID,并为其创建工作人员。像:rails runner GameWorker.new(:game_id => game_id).start_game
  • 页面A中的脚本将用户重定向到页面B,在那里他可以看到新创建的游戏,其他人可以加入。

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

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

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

更新 我要重新解释一下我的问题:如何从ruby中运行linux命令,不要等待命令结束?我指的是&>>的等价物。例如,在php中,&>>工作正常,我不需要使用任何特殊的PHP功能,但在ruby中它似乎被覆盖,脚本等待命令结束并获取输出。

1 个答案:

答案 0 :(得分:3)

我强烈建议不要在每场比赛中运行一个进程。如果你想要一个非基于回合的非阻塞游戏,那么你可能想要查看事件 - 机器,或类似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