Est-thread-safe classe stdlib Ruby Logger?
-
09-10-2019 - |
Question
En bref, est la bibliothèque standard classe Logger dans Ruby thread-safe ? Seule l'information utile Google relevai était quelqu'un sur un forum en disant qu'il « semble » thread-safe. Et je ne me sens pas comme le temps passé à tester un enregistreur pour essayer de savoir si elle est ou non.
Pour le moment, je suis en utilisant log4r qui est thread-safe, mais il est exagéré si la norme bibliothèque fait déjà.
La solution
Un rapide coup d'oeil à logger.rb révèle un code tel que le suivant:
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
Ainsi, alors que je ne peux garantir si elle obtient thread-safety correct , je peux confirmer qu'il fait un effort concerté pour le faire bien!
P.S. Il est souvent facile de répondre à des questions comme celle-ci pour vous-même en lisant le code: -)
Autres conseils
Voici ma réponse originale, qui est en fait mauvais . Commentaire de lecture Nemo157 ci-dessous. Je l'ai laissé ici pour référence.
Original:
Je ne pense pas que cela importe. Toutes les implémentations de Ruby que je connais si bien courir efficacement un fil à la fois de toute façon. Il ne vous permet de lancer plusieurs threads, mais seulement un court de fil à la fois par processus
Certaines classes Ruby sont conçus pour être thread-safe, mais ne dit pas explicitement dans les mots d'une syllabe dans leur documentation. Contrairement à la documentation dans d'autres langages de programmation tels que PHP.
Je me souviens avoir demandé si Queue
était thread-safe sur débordement de la pile, et même si elle était, la documentation n'a pas précisé cela.