Является ли Ruby stdlib Logger классом потокобезопасным?
Короче говоря, стандартный класс Logger в Ruby потокобезопасен? Только полезная информация Google оказалась кем-то на форуме, говорящей, что это "кажется" потокобезопасным. И я не хочу тратить время на тестирование логгера, чтобы попытаться выяснить, есть оно или нет.
В настоящее время я использую log4r, который является потокобезопасным, но он переполняется, если стандартная библиотека уже делает это.
Ответы
Ответ 1
Быстрый просмотр 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. Часто можно легко ответить на такие вопросы, прочитав код: -)
Ответ 2
Некоторые классы Ruby предназначены для потокобезопасности, но явно не говорят об этом в одном слоге в своей документации. В отличие от документации на других языках программирования, таких как PHP.
Я помню, как меня спрашивали, был ли Queue
потокобезопасным в переполнении стека, и даже при том, что это было, в документации не было написано.
Ответ 3
Ниже мой оригинальный ответ, который на самом деле неправильный. Прочтите комментарий Nemo157 ниже. Я оставил его здесь только для справки.
Оригинал:
Я не думаю, что это важно. Все реализации Ruby, которые я знаю до сих пор, эффективно запускают по одному потоку в любой момент: он позволяет вам запускать много потоков, но только один поток выполняется за один раз за процесс.