9

少数のアクションがかなりの計算時間を必要とするRailsアプリケーションがあります。これらのアクションをバックグラウンドタスクとして管理するという複雑さを経験するのではなく、処理を複数のスレッドに分割でき、マルチコアサーバーでJRubyを使用することで、すべてのスレッドが妥当な時間で完了するようにすることができます。(お客様は、バックグラウンドでタスクを実行するのではなく、このアプローチを維持することにすでに強い関心を示しています。)

問題は、Railsロガーへの書き込みがこれらのスレッド内で機能しないことです。ログファイルには何も表示されません。この問題への参照がいくつか見つかりましたが、解決策はありません。デバッグに役立つようにコードにputsを挿入してもかまいませんが、stdoutはglassfishgemアプリサーバーに食い尽くされているようです。

毎回新しいログを作成せずに、Railsのrubyスレッド内で正常にログを記録した人はいますか?

4

2 に答える 2

6

私は同じ問題で頭を悩ませていました。私にとっての答えは次のとおりでした。

Thread.new do
  begin
    ...
  ensure
    Rails.logger.flush
  end
end
于 2010-08-18T19:41:48.843 に答える
0

バックグラウンド タスクに関する懸念は理解できますが、Rails でスレッドをスピンオフするのは恐ろしいことです。このフレームワークは、マルチスレッド化をほとんど考慮していません。つまり、すべての Rails オブジェクトをスレッドセーフではないものとして扱う必要があります。データベース接続でさえ扱いにくくなります。

ロガーについて: 標準の Ruby ロガー クラスはスレッド セーフである必要があります。しかし、Rails がそれを使用したとしても、Rails アプリがそれに対して行っていることを制御することはできません。たとえば、ベンチマーク メカニズムは、レベルを切り替えることによってロガーを「沈黙」させます。

Railsロガーの使用は避けます。スレッドを使用する場合は、その操作のメッセージをログに記録するスレッド内に新しいロガーを作成します。スレッドごとに新しいログを作成したくない場合は、各スレッドがアクセスできるスレッド セーフなログ オブジェクトをランタイムに 1 つ作成することもできます。

あなたの代わりに、私はおそらくバックグラウンドジョブソリューションをもう一度見てみたいと思います. DRb は悪夢のように見えますが、「bj」は素晴らしく簡単に思えます。ただし、JRuby で実行するには多少の作業が必要でした。JRuby の Java スケジューラを使用する代替手段もあります。http: //www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails を参照してください。

于 2009-10-21T10:39:39.430 に答える