2

我正在从浏览器启动长时间运行的进程,并在完成后显示结果。我在我的控制器中定义了:

def runthejob
   pid = Process.fork
   if pid.nil? then   
    #Child
    output = execute_one_hour_job()
    update_output_in_database(output)
    # Exit here as this child process shouldn't continue anymore
    exit  
   else
    #Parent
    Process.detach(pid)
    #send response - job started...
end
  1. parent 中的请求正确完成。但是,在孩子中,总是有一个“500 内部服务器错误”。rails 报告“在 227192 毫秒内完成 500 内部服务器错误”。我猜这是因为子进程的请求响应周期没有完成,因为子进程中有一个“退出”。我该如何解决?

  2. 这是执行长时间运行的进程的正确方法吗?有没有更好的方法呢?

  3. 当孩子正在运行时,如果我执行 " ps -e | grep rails" ,我会看到有两个 "rails server" 实例。(我使用命令“ rails server”来启动我的 Rails 服务器。)

    ps -e | grep rails
    75678 ttys002 /Users/xx/ruby-1.9.3-p194/bin/ruby script/rails server
    75696 ttys002 /Users/xx/ruby-1.9.3-p194/bin/ruby script/rails server

这是否意味着有两台服务器正在运行?现在如何处理请求?请求不会转到第二台服务器吗?

谢谢你帮助我。

4

2 回答 2

0

在 Rails 中有很多框架可以做到这一点:DelayedJob、Resque、Sidekiq 等。

你可以在 railscasts 上找到很多例子:http: //railscasts.com/

于 2012-08-01T20:45:08.670 回答
0

在生产中尝试您的代码,看看是否出现相同的错误。如果没有,您的错误可能来自于第一个请求完成时清除了开发环境,而您的分叉仍然需要该环境存在。我还没有用叉子验证这一点,但这就是线程发生的情况。

config/development.rb 中的这一行将保留环境,但任何代码更改都需要重新启动服务器。

config.cache_classes = true
于 2012-08-01T21:00:33.983 回答