简而言之,Ruby中的标准库Logger类是否是线程安全的?只有谷歌出现的有用信息才是论坛上有人说它“似乎”是线程安全的。而且我不想花时间测试记录器来试图判断它是否存在。
目前我正在使用线程安全的log4r,但如果标准库已经这样做,那就太过分了。
答案 0 :(得分:46)
快速查看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
因此,虽然我无法保证它是否具有线程安全性正确,但我可以确认它正在齐心协力做正确的事情!
P.S。通过阅读代码,通常很容易回答这样的问题: - )
答案 1 :(得分:0)
以下是我原来的回复,实际上是错误。阅读下面的Nemo157评论。我把它留在这里仅供参考。
<强>原始强>
我认为这不重要。到目前为止,我所知道的Ruby的所有实现都有效地一次运行一个线程:它允许你启动许多线程,但每个进程一次只运行一个线程。
答案 2 :(得分:0)
某些Ruby类被设计为线程安全的,但是在文档中的一个音节的单词中没有明确说明。与其他编程语言(如PHP)中的文档不同。
我记得当被问到Queue
是否在Stack Overflow上是线程安全的时候,即使它是,但文档并没有拼写出来。
答案 3 :(得分:0)
尝试将日志混入多线程中
require 'logger'
require 'parallel'
logger = Logger.new("/tmp/test.log")
Parallel.map(['a','b'], :in_threads => 2) do |letter|
1000.times do
logger.info letter * 5000
end
end
测试日志文件
egrep -e 'ab' -e 'ba' /tmp/test.log
[empty]
未混合日志的原因:
def write(message)
@mutex.synchronize do
...
@dev.write(message)
end
end