2011-01-11 9 views
27

In breve, è la classe standard Logger in Ruby thread-safe? Solo le informazioni utili che Google ha trovato era qualcuno su un forum che diceva che "sembra" thread-safe. E non ho voglia di passare il tempo a testare un logger per cercare di capire se lo è o meno.La classe stdlib Logger di Ruby è thread-safe?

Per il momento sto utilizzando log4r che è thread-safe, ma è eccessivo se la libreria standard già lo fa.

risposta

44

Un rapido sguardo a logger.rb rivela il codice come il seguente:

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 

Così, mentre io non posso garantire per se ottiene thread-sicurezza corretta, posso confermare che sta facendo uno sforzo concertato per farlo bene!

P.S. Spesso è facile rispondere a domande come questo per te leggendo il codice :-)

-1

Qui di seguito è la mia risposta originale, che è in realtà sbagliato. Leggi il commento di Nemo157 qui sotto. L'ho lasciato qui solo per riferimento.

originale:

Non credo sia importante. Tutte le implementazioni di Ruby che conosco finora funzionano con un thread alla volta: Permette di avviare molti thread, ma solo un thread viene eseguito alla volta per processo.

+8

Sì, ma anche se viene eseguito un solo thread alla volta che non rende il codice Ruby multi-threaded thread-safe in quanto le operazioni atomiche possono comprendere più istruzioni. Per esempio. 'x = point.x; point.x = x + 1', il thread potrebbe essere interrotto tra le due istruzioni e un altro thread potrebbe modificare il valore di 'point.x' che verrebbe sovrascritto quando questo thread riprenderà. Inoltre JRuby è veramente multi-threaded poiché utilizza thread Java. – Nemo157

+0

Buon punto. Ho lasciato la mia risposta originale come riferimento. – kirakun

0

Alcune classi Ruby sono progettate per essere thread-safe, ma non lo dicono esplicitamente in parole di una sillaba nella loro documentazione. A differenza della documentazione in altri linguaggi di programmazione come PHP.

Ricordo che mi è stato chiesto se lo Queue non fosse thread-safe su Stack Overflow e, anche se lo fosse, la documentazione non l'ha spiegato chiaramente.

Problemi correlati