2011-01-11 2 views
27

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

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

ответ

44

Быстрый взгляд на 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

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

Оригинал:

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

+8

Да, но даже при том, что только один поток работает одновременно, что не обеспечивает многопоточность Ruby-кода в потоковом режиме, так как атомарные операции могут охватывать несколько операторов. Например. 'x = point.x; point.x = x + 1', поток может быть прерван между двумя операторами, а другой поток может изменить значение 'point.x', которое будет перезаписано при возобновлении этого потока. Кроме того, JRuby действительно многопоточен, поскольку использует потоки Java. – Nemo157

+0

Хорошая точка. Я оставил свой первоначальный ответ в качестве ссылки. – kirakun

0

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

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

Смежные вопросы