2010-08-06 18 views
7

captura de pantalla y explicará mi pregunta:¿Por qué mi demo de Ruby thread no usa ambos núcleos? Con suerte

a = Thread.new { loop {} } 
b = Thread.new { loop {} } 
a.join 

Ruby threads demo CPU usage http://img7.imageshack.us/img7/9858/rubycores.png

¿Cómo puede ser mis dos núcleos no están al tope? No importa cuántos hilos use, siempre es el mismo; el uso total de CPU nunca parece exceder el 52%.

>ruby -v 
ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32] 
+0

Podría estar relacionado con o un duplicado de: http://stackoverflow.com/questions/56087/does-ruby-have-real-multithreading –

Respuesta

0

¿Qué versión de rubí está usando y que interprete? (JRuby, "ruby regular", etc.)

No todos los intérpretes de rubíes pueden aprovechar los múltiples núcleos/procesadores.

+0

de hecho, el enlace de nbolton contiene una buena lista de la gran cantidad de intérpretes y sus modelos de subprocesamiento –

+0

ruby ​​1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32] –

+0

Si está utilizando 1.8.6, entonces parece que su pregunta se responde en el enlace que tiene arriba. ¿Qué ocurre cuando cambias a una versión que realmente admite subprocesos nativos? –

1

Lo principal que hay que recordar es que hay una diferencia entre Ruby (lenguaje) y Ruby (implementación). No dejas claro a qué te refieres, pero como estás teniendo problemas, supongo que te refieres a Ruby (implementación).

En cuanto a algunas de las respuestas anteriores:

de Ruby 1.9.1: Native threads in Ruby 1.9.1, whats in it for me?

Los hilos de rubí en 1.9 son nativos, pero se han "ralentizado" para permitir que sólo un hilo se ejecute a un momento. Esto se debe a que confundiría el código existente si los hilos realmente se ejecutan en paralelo.

Does ruby have real multithreading?

Esto da una explicación fantástica de Rubí que rosca en varias máquinas virtuales Rubí.

4

Parece que está utilizando MRI, que es incapaz de ejecutar subprocesos en paralelo. Por el momento, las únicas implementaciones de Ruby listas para producción que pueden ejecutar subprocesos en paralelo son JRuby e IronRuby.

Recuerde, si desea que los subprocesos realmente se ejecuten en paralelo, entonces cada capa en la pila debe ser capaz de hacer eso. Tome JRuby, por ejemplo: JRuby puede ejecutar hilos de Ruby en paralelo. Sin embargo, se implementa hilos mediante la asignación de ellos a las roscas de JVM, así que si la JVM es incapaz de correr hilos en paralelo (y hay algunos para los que este es el caso), entonces el hecho de que JRuby puede ejecutar Rubí hilos en paralelo no te ayuda ni un poco. Muchas JVM, a su vez, asignan subprocesos de JVM a los subprocesos del sistema operativo. Y nuevamente: si el SO no es capaz de ejecutar subprocesos en paralelo, no hay nada que la JVM pueda hacer. Y por último pero no menos importante: si solo hay un procesador, el ejercicio completo no tiene sentido de todos modos.

+0

hey, ¿sigue siendo así con la resonancia magnética? tratando de resolver esto –

+1

@BobSinclar: Sí. MRI no admite la ejecución de múltiples hilos al mismo tiempo. Y la resonancia magnética ya no se está desarrollando, por lo que nunca se desarrollará. YARV tampoco lo admite, aunque podría serlo en el futuro. JRuby, IronRuby y Rubinius (> 2.0) * do * lo soportan. No estoy seguro acerca de MacRuby y MagLev. –

+0

muchas gracias por responder Jörg –

2

Creo que esta respuesta es increíble.

Does ruby have real multithreading?

Desde su están utilizando de Ruby 1.8.6, la aplicación de resonancia magnética. Esta cita de la URL anterior explica por qué solo se usa un núcleo.

MRI implementa Rubí Temas como Green Threads dentro de su intérprete. Desafortunadamente, no permite que esos hilos se programen en paralelo, solo pueden ejecutar un hilo a la vez.

Tenga en cuenta que MacRuby (una especie de puerto de YARV) eliminó recientemente el GIL. Entonces, su código de demostración usará ambos núcleos con MacRuby 0.5 o una versión posterior. Por ahora, es la única Implementación de Ruby que se puede ejecutar en paralelo que no depende de JVM o CLR.

Cuestiones relacionadas