2010-08-06 4 views
7

Hoffentlich Screenshot wird meine Frage erklären:Warum verwendet meine Ruby-Thread-Demo nicht beide Kerne?

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

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

So wie kommt meine beiden Kerne werden aus nicht ausgereizt? Egal wie viele Threads ich benutze, es ist jedes Mal dasselbe; Die gesamte CPU-Auslastung scheint nie über 52% zu liegen.

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

Könnte verwandt werden mit oder ein Duplikat von: http://StackOverflow.com/Questions/56087/does-ruby-Have-Real-Multithreading –

Antwort

0

Welche Version von Ruby verwenden Sie und welchen Interpreter? (JRuby, "regulärer Rubin", usw.?)

Nicht alle Ruby-Interpreter können mehrere Kerne/Prozessoren nutzen.

+0

in der Tat, nbolton Link enthält eine gute Liste der überwiegenden Anzahl von Dolmetschern und ihre threading models –

+0

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

+0

Wenn Sie 1.8.6 verwenden, dann klingt es so, als ob Ihre Frage in dem obigen Link beantwortet wird. Was passiert, wenn Sie zu einer Version wechseln, die native Threads unterstützt? –

1

Die Hauptsache ist, dass es einen Unterschied zwischen Ruby (Sprache) und Ruby (Implementierung) gibt. Sie machen es nicht klar, was Sie meinen, aber da Sie Probleme haben, nehme ich an, Sie meinen Ruby (Implementierung).

Mit Blick auf einigen früheren Antworten:

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

Die Rubinfäden in 1.9 sind native, aber sie haben „verlangsamt“ nur ein Thread zu ermöglichen, an zu laufen eine Zeit. Dies liegt daran, dass der vorhandene Code verwechselt würde, wenn die Threads tatsächlich parallel ausgeführt würden.

Does ruby have real multithreading?

Dies ergibt eine fantastische Erklärung von Ruby Threading auf verschiedenen Ruby-VMs.

4

Es sieht so aus, als ob Sie MRI verwenden, die Threads nicht parallel ausführen kann. Im Moment sind die einzigen produktionsbereiten Ruby-Implementierungen, die Threads parallel ausführen können, JRuby und IronRuby.

Denken Sie daran, wenn Threads tatsächlich parallel ausgeführt werden sollen, dann muss jede Schicht im Stack dazu in der Lage sein. Nehmen Sie JRuby zum Beispiel: JRuby kann Ruby-Threads parallel ausführen. Er implementiert jedoch Threads, indem er sie JVM-Threads zuordnet. Wenn also die JVM nicht in der Lage ist, Threads parallel auszuführen (und es gibt einige, bei denen dies der Fall ist), kann die Tatsache, dass JRuby Ruby Threads in Parallel hilft dir nicht ein bisschen. Viele JVMs wiederum ordnen JVM-Threads OS-Threads zu. Und noch einmal: Wenn das Betriebssystem Threads nicht parallel ausführen kann, kann die JVM nichts tun. Und last but not least: Wenn es nur einen Prozessor gibt, ist die ganze Übung sowieso sinnlos.

+0

Hey, ist das bei MRI immer noch so? versuchen, das herauszufinden –

+1

@BobSinclar: Ja. MRI unterstützt nicht das gleichzeitige Ausführen mehrerer Threads. Und MRI wird nicht mehr entwickelt, also wird es nie. YARV unterstützt es auch nicht, auch wenn es in Zukunft so sein könnte. JRuby, IronRuby und Rubinius (> 2.0) * unterstützen es. Nicht sicher über MacRuby und MagLev. –

+0

vielen Dank für die Antwort auf Jörg –

2

Ich denke, diese Antwort ist genial.

Does ruby have real multithreading?

Da Ihr verwenden Ruby-1.8.6, die MRI-Implementierung. Dieses Zitat aus der obigen URL erklärt, warum nur ein Kern verwendet wird.

MRI implementiert Ruby-Threads als Green Threads in seinem Dolmetscher. Leider können diese Threads nicht parallel geplant werden, sie können jeweils nur einen Thread gleichzeitig ausführen.

Beachten Sie, dass MacRuby (eine Art Port von YARV) kürzlich die GIL entfernt. Ihr Demo-Code verwendet also beide Cores mit MacRuby 0.5 oder neuer. Vorläufig ist es die einzige Ruby-Implementierung, die parallel ausgeführt werden kann, unabhängig von JVM oder CLR.

Verwandte Themen