ruby on rails,fork,long running background process

时间:2012-08-01 20:40:09

标签: ruby-on-rails fork

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

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. 父级请求正确完成。但是,在孩子中,始终存在“500内部服务器错误”。 rails报告“已完成500内部服务器错误227192ms”。我猜这是因为子进程的请求响应周期没有完成,因为子进程中有“退出”。我该如何解决这个问题?

  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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

config.cache_classes = true