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. 親のリクエストは正しく完了します。ただし、子では、常に「500内部サーバーエラー」が発生します。railsは、「227192msで500の内部サーバーエラーを完了しました」と報告します。これは、子に「出口」があるため、子プロセスの要求応答サイクルが完了していないために発生すると推測しています。これを修正するにはどうすればよいですか?

  2. これは、長時間実行されるプロセスを実行する正しい方法ですか?それを行うためのより良い方法はありますか?

  3. 子供が走っているときに「ps -e | grep rails」を実行すると、「railsserver」のインスタンスが2つあることがわかります。(コマンド " 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

これは、2台のサーバーが実行されていることを意味しますか?リクエストは現在どのように処理されていますか?リクエストは2番目のサーバーに送信されませんか?

私を助けてくれてありがとう。

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 に答える