2011-01-11 13 views
27

En resumen, ¿la biblioteca estándar es Logger clase en Ruby thread-safe? Solo la información útil que Google presentó fue alguien en un foro que dice que "parece" seguro para subprocesos. Y no tengo ganas de pasar tiempo probando un registrador para tratar de averiguar si es o no.¿La clase stdlib Logger de Ruby es segura para subprocesos?

Por el momento estoy usando log4r que es seguro para subprocesos, pero es excesivo si la biblioteca estándar ya lo hace.

Respuesta

44

Un rápido vistazo a logger.rb revela código como el siguiente:

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 

Así que aunque no puedo responder por si se pone hilo de seguridad correcta, puedo confirmar que se está haciendo un esfuerzo concertado para hacerlo bien!

P.S. A menudo es fácil responder preguntas como esta leyendo el código :-)

-1

A continuación se muestra mi respuesta original, que en realidad es incorrecto. Lea el comentario de Nemo157 a continuación. Lo dejé aquí solo como referencia.

original:

No creo que importe. Todas las implementaciones de Ruby que conozco hasta ahora ejecutan efectivamente un hilo a la vez de todos modos: te permite iniciar muchos hilos, pero solo un hilo se ejecuta a la vez por proceso.

+8

Sí, pero a pesar de que solo se ejecuta un subproceso al mismo tiempo, no hace que el código Ruby multihilo sea seguro para subprocesos, ya que lo que deberían ser operaciones atómicas puede abarcar varias sentencias. P.ej. 'x = punto.x; point.x = x + 1', el hilo podría estar interrumpido entre las dos instrucciones y otro hilo podría modificar el valor de 'point.x' que se sobrescribirá cuando se reanude este hilo. Además, JRuby es realmente multihilo ya que utiliza hilos de Java. – Nemo157

+0

Buen punto. Dejé mi respuesta original como referencia. – kirakun

0

Algunas clases de Ruby están diseñadas para ser seguras para hilos, pero no lo dicen explícitamente en palabras de una sílaba en su documentación. A diferencia de la documentación en otros lenguajes de programación como PHP.

Recuerdo que me preguntaron si Queue era seguro para subprocesos en Stack Overflow, y aunque lo era, la documentación no lo deletreaba.

Cuestiones relacionadas