我从浏览器启动长时间运行的进程,并在完成后显示结果。我在我的控制器中定义了:
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
父级请求正确完成。但是,在孩子中,始终存在“500内部服务器错误”。 rails报告“已完成500内部服务器错误227192ms”。我猜这是因为子进程的请求响应周期没有完成,因为子进程中有“退出”。我该如何解决这个问题?
这是执行长时间运行进程的正确方法吗?有没有更好的方法呢?
当孩子正在运行时,如果我执行“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
这是否意味着有两台服务器正在运行?现在如何处理请求?请问不要去第二台服务器?
感谢您的帮助。
答案 0 :(得分:1)
在rails中有很多框架可以做到这一点:DelayedJob,Resque,Sidekiq等。
你可以在railscast上找到很多例子:http://railscasts.com/
答案 1 :(得分:0)
在生产中试用您的代码,看看是否出现相同的错误。如果没有,您的错误可能来自第一个请求完成时清除的开发环境,而您的分支仍然需要环境存在。我没有用forks验证这一点,但这就是线程会发生的事情。
config / development.rb中的这一行将保留环境,但任何代码更改都需要重新启动服务器。
config.cache_classes = true