要するに、Ruby の標準ライブラリLoggerクラスはスレッドセーフですか? Google が見つけた唯一の有用な情報は、スレッドセーフに「見える」と言っているフォーラムの誰かでした。また、ロガーのテストに時間を費やして、ロガーがそうであるかどうかを判断しようとする気もありません。
当分の間、スレッドセーフなlog4rを使用していますが、標準ライブラリがすでにそれを行っているとやり過ぎです。
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コードを読むことで、このような質問に簡単に答えることができます:-)
以下は私の元の応答ですが、実際には間違っています。以下のNemo157のコメントを読んでください。参考までにここに残しておきました。
オリジナル:
私はそれが重要だとは思わない。私がこれまでに知っているRubyのすべての実装は、とにかく一度に1つのスレッドを効果的に実行します。これにより、多くのスレッドを開始できますが、プロセスごとに一度に実行されるスレッドは1つだけです。
一部の Ruby クラスはスレッド セーフになるように設計されていますが、そのドキュメントでは 1 つの音節の言葉で明示的にそう述べていません。PHP などの他のプログラミング言語のドキュメントとは異なります。
Queue
Stack Overflow でスレッドセーフかどうか尋ねられたのを覚えています。