31

要するに、Ruby の標準ライブラリLoggerクラスはスレッドセーフですか? Google が見つけた唯一の有用な情報は、スレッドセーフに「見える」と言っているフォーラムの誰かでした。また、ロガーのテストに時間を費やして、ロガーがそうであるかどうかを判断しようとする気もありません。

当分の間、スレッドセーフなlog4rを使用していますが、標準ライブラリがすでにそれを行っているとやり過ぎです。

4

4 に答える 4

49

logger.rb をざっと見てみると、次のようなコードが明らかになります。

def write(message)
  @mutex.synchronize do
    if @shift_age and @dev.respond_to?(:stat)
      begin
        check_shift_log
      rescue
        raise Logger::ShiftingError.new("Shifting failed. #{$!}")
      end
    end
    @dev.write(message)
  end
end

そのため、スレッドセーフがcorrectになるかどうかは保証できませんが、それを正しく行うために協調的な努力をしていることは確認できます!

PSコードを読むことで、このような質問に簡単に答えることができます:-)

于 2011-01-11T17:06:50.807 に答える
0

以下は私の元の応答ですが、実際には間違っています。以下のNemo157のコメントを読んでください。参考までにここに残しておきました。

オリジナル:

私はそれが重要だとは思わない。私がこれまでに知っているRubyのすべての実装は、とにかく一度に1つのスレッドを効果的に実行します。これにより、多くのスレッドを開始できますが、プロセスごとに一度に実行されるスレッドは1つだけです。

于 2011-01-11T18:27:46.307 に答える
0

一部の Ruby クラスはスレッド セーフになるように設計されていますが、そのドキュメントでは 1 つの音節の言葉で明示的にそう述べていません。PHP などの他のプログラミング言語のドキュメントとは異なります。

QueueStack Overflow でスレッドセーフかどうか尋ねられたのを覚えています。

于 2011-01-11T23:14:17.120 に答える