Подтвердить что ты не робот

Является ли Ruby stdlib Logger классом потокобезопасным?

Короче говоря, стандартный класс Logger в Ruby потокобезопасен? Только полезная информация Google оказалась кем-то на форуме, говорящей, что это "кажется" потокобезопасным. И я не хочу тратить время на тестирование логгера, чтобы попытаться выяснить, есть оно или нет.

В настоящее время я использую log4r, который является потокобезопасным, но он переполняется, если стандартная библиотека уже делает это.

4b9b3361

Ответ 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, которые я знаю до сих пор, эффективно запускают по одному потоку в любой момент: он позволяет вам запускать много потоков, но только один поток выполняется за один раз за процесс.