Почему в моей демоверсии Ruby-потока не используются оба ядра? - PullRequest
7 голосов
/ 06 августа 2010

Надеюсь, этот скриншот объяснит мой вопрос:

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

Демонстрация использования потоков в Ruby http://img7.imageshack.us/img7/9858/rubycores.png

Так почему же оба моих ядра не работают максимально?Независимо от того, сколько потоков я использую, каждый раз одно и то же;общее использование процессора никогда не превышает 52%.

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

Ответы [ 4 ]

4 голосов
/ 07 августа 2010

Похоже, что вы используете MRI, который не способен выполнять потоки параллельно. На данный момент единственными готовыми к реализации реализациями Ruby, которые могут запускать потоки параллельно, являются JRuby и IronRuby.

Помните, что если вы хотите, чтобы потоки фактически работали параллельно, то каждый слой в стеке должен быть в состоянии это сделать. Например, JRuby: JRuby может запускать потоки Ruby параллельно. Тем не менее, он реализует потоки, сопоставляя их с потоками JVM, поэтому, если JVM не способна запускать потоки параллельно (и есть некоторые, для которых это так), то тот факт, что JRuby может работать Параллельные потоки 1005 * Ruby не помогут вам ни на шаг. Многие JVM, в свою очередь, отображают потоки JVM в потоки ОС. И снова: если ОС не способна запускать потоки параллельно, JVM ничего не может сделать. И последнее, но не менее важное: если есть только один процессор, все упражнение бессмысленно.

2 голосов
/ 12 августа 2010

Я думаю, что этот ответ потрясающий.

Имеет ли ruby ​​реальную многопоточность?

Так как вы используете Ruby 1.8.6, MRI. Эта цитата из приведенного выше URL-адреса объясняет, почему используется только одно ядро.

MRI реализует Ruby Threads как Green Threads в своем интерпретаторе. К сожалению, он не позволяет планировать эти потоки параллельно, они могут запускать только один поток за раз.

Обратите внимание, что MacRuby (своего рода порт YARV) недавно удалил GIL. Таким образом, ваш демонстрационный код будет использовать оба ядра с MacRuby 0.5 или более поздней версией. На данный момент это единственная реализация Ruby, которая может работать параллельно, независимо от JVM или CLR.

1 голос
/ 06 августа 2010

Главное, что нужно помнить, это то, что существует разница между Ruby (язык) и Ruby (реализация).Вы не понимаете, что вы имеете в виду, но поскольку у вас возникают проблемы, я предполагаю, что вы имеете в виду Ruby (реализация).

Рассматривая некоторые предыдущие ответы:

Ruby 1.9.1: Собственные потоки в Ruby 1.9.1, что для меня?

Рубиновые потоки в 1.9 являются нативными, но они "замедлены", чтобы позволить только одному потокубежать одновременно.Это связано с тем, что это может привести к путанице в существующем коде, если потоки действительно будут работать параллельно.

Имеет ли ruby ​​реальную многопоточность?Ruby Threading на различных виртуальных машинах Ruby.

0 голосов
/ 06 августа 2010

Какую версию ruby ​​вы используете и какой переводчик? (JRuby, "обычный рубин" и т. Д.?)

Не все интерпретаторы ruby ​​могут использовать преимущества нескольких ядер / процессоров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...