Является ли класс Ruby's stdlib Logger поточно-ориентированным? - PullRequest
29 голосов
/ 11 января 2011

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

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

Ответы [ 3 ]

46 голосов
/ 11 января 2011

Беглый взгляд на 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. Часто легко ответить на подобные вопросы, прочитав код: -)

0 голосов
/ 12 января 2011

Некоторые классы Ruby спроектированы так, чтобы быть потокобезопасными, но не говорите об этом явно словами одного слога в своей документации. В отличие от документации на других языках программирования, таких как PHP.

Я помню, как меня спрашивали, является ли Queue поточно-ориентированным при переполнении стека, и хотя в документации это не прописано.

0 голосов
/ 11 января 2011

Ниже приведен мой первоначальный ответ, который на самом деле неверен .Прочитайте комментарий Nemo157 ниже.Я оставил это здесь только для справки.

Оригинал:

Я не думаю, что это имеет значение.Все известные мне реализации Ruby до сих пор эффективно запускают по одному потоку за раз: он позволяет запускать много потоков, но только один поток запускается за один процесс.

...