2010-05-14 12 views
15

Me parece que la comunidad de Ruby ha estado un poco loca sobre la autocarga desde this famous thread, desalentando su uso por motivos de seguridad de la hebra.¿La carga automática de subprocesos es segura en Ruby 1.9?

¿Alguien sabe si esto ya no es un problema en Ruby 1.9.1 o 1.9.2? He visto un poco de conversación sobre envolver requiere mutexes y tal, pero los registros de cambios 1.9 (o al menos tanto como he podido encontrar) no parecen abordar esta pregunta en particular. Me gustaría saber si puedo comenzar a cargar automáticamente en bibliotecas de solo 1.9 sin ninguna pena razonable.

Gracias de antemano por cualquier idea.

+1

El enlace "this famous thread" está roto –

Respuesta

7

No sé sobre el caso general, pero el ejemplo repro de que el hilo no se rompa en 1.9.1:

autoloaded.rb:

sleep 1 
Bar::Foo = 1 

autoloader.rb:

module Bar 
    autoload :Foo, 'autoloaded.rb' 
end 

t1 = Thread.new { Bar::Foo } 
t2 = Thread.new { Bar::Foo } 
t1.join; t2.join 
+2

D'oh. ¿Por qué oh por qué no pensé en eso? Después de reproducirlo yo mismo y probar algunas variaciones de prueba de estrés (y confirmar con RVM que aún está roto en 1.8.7, JRuby y Rubinius - todo ** excepto ** 1.9.1 y 1.9.2) estoy llamando esto respondió. ¡Gracias! – SFEley

+0

Estoy sorprendido de que no sea seguro para subprocesos en JRuby, pensé que la seguridad de subprocesos era uno de sus objetivos. –

-4

siempre está roto.

subload le permite cambiar de modo cuando se encuentra en un entorno con rosca.

Utilizo la carga automática aún en el entorno con rosca, pero solo durante una secuencia de inicio de rosca única. No veo ninguna buena razón para tener un proceso de inicio multiproceso en una aplicación real. Si no tiene uno, es probable que necesite hacer cola acciones para las bibliotecas de carga compartida como siempre tendrá problemas de seguridad de rosca con la configuración de clase y nivel de instancia, la mayoría partuclarly con cosas como:

class Lib 
    extend SomeClassFuncs 
    do_something_with_class_funcs 
end 

Este código no es hilo seguro un tiempo de carga, independientemente del cargador.

Si no puede ver esto, no debe enhebrar.

+0

Subload? ¿Qué es subload? - Veo tu punto, pero como señalas, ese tipo de metaprogramación es igual de inseguro con 'require' que con' autoload'. Mi pregunta era si el error específico en 'autocarga 'documentado por Charles Nutter hace algún tiempo había sido reparado en Ruby 1.9, y lo ha sido. – SFEley

+0

La subcarga es https://github.com/raggi/subload – raggi

+0

El error de seguridad de la secuencia de carga automática no se puede solucionar. Solo algunos casos pueden ser ajustados. – raggi

9

Llevando una actualización de 2011 a esto, ya que tenía curiosidad sobre eso también.

Dos entradas están actualmente abiertas:

Los desarrolladores de núcleo sugieren que requieren y el trabajo de carga automática de la misma manera y es seguro para subprocesos, en CRuby/JRuby 1.9 . Esto, en el sentido de que ruby ​​mantiene un bloqueo hasta que el archivo esté completamente cargado.

Sin embargo, esto tiene el inconveniente efecto secundario de introducir bloqueos potenciales. Específicamente:

  1. Th1 carga A y bloqueos que
  2. Th2 carga B y lo bloquea
  3. Th1 intenta cargar B como parte de la carga A, comienza la espera de Th2
  4. Th2 intenta cargar A como parte de la carga B, comienza a esperar Th1
  5. Deadlock ...

La conclusión probablemente sea: requiere todo lo que necesita antes de iniciar un hilo si existe la posibilidad de un punto muerto en su aplicación.

+0

¿Querría A, y B sería querer A, ser un ligero olor a código? –

+1

Me imagino este tipo de cosas sucediendo en un servidor de subprocesos cuya carga de página inicial dispara toneladas de carga automática. Los dos hilos anteriores en realidad tienen una mención de este mismo escenario. –

+2

Agregando a esto, vale la pena señalar que, independientemente de la seguridad del hilo de rubí, [máquina de eventos no es segura para subprocesos] (https://github.com/eventmachine/eventmachine/issues/97). Teniendo en cuenta que tanto thin como Goliath se basan en él, y que ni mongrel ni webrick usan hilos, y que mod_rack depende de los trabajadores de mongrel/webrick, en realidad no importa al final del día. ;-) –

Cuestiones relacionadas