2

Railsアプリケーション内でDRbを使用して、Railsプロセスの外部で高価なタスクをオフロードしています。DRbObject.newを使用してクライアントスタブを初期化する前に、DRb.start_serviceを使用してDRbサービスを初期化する必要があります。

モデルまたはコントローラーでこれを行うと、スレッドが不確実な状態のままになるように見えます。私が雑種を出るとき、それは言います:

Reaping 1 threads for slow workers because of 'shutdown' Waiting for 1 requests to finish, could take 60 seconds.

environment.rbでサービスを初期化することは、大きな注意点でうまく機能しているようです。私は、一部のRailsワーカーでもbackgroundrbを使用しています。それらが初期化されると、environment.rbが実行され、二重初期化による問題が再び発生します。

クライアントでDRb.start_serviceを呼び出す正しい場所はどこですか?または、同じプロセスで2回実行することを回避できるように、初期化をテストする方法はありますか?

4

1 に答える 1

3

次のコードは、二重の初期化を回避するために、プライマリ サーバーが既にアクティブであるかどうかを確認します。DRb スレッドを、mongrel が使用している ThreadGroup とは異なる ThreadGroup に移動することで、mongrel の終了時のハングを回避できます。

    # start DRb service if it hasn't been started before
    begin
        DRb.current_server
    rescue DRb::DRbServerNotFound
        DRb.start_service
        # move to different ThreadGroup to avoid mongrel hang on exit
        ThreadGroup.new.add DRb.thread
    end

(environment.rb ではなく) クラスが使用される前にこれを実行すると、最良の結果が得られ、backgroundrb で正常に動作するようです。

于 2008-11-18T18:50:34.657 に答える